├── CatalystToolbarMenuButton ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ ├── icon-120.png │ │ ├── icon-152.png │ │ ├── icon-167.png │ │ ├── icon-180.png │ │ ├── icon-29.png │ │ ├── icon-40.png │ │ ├── icon-58.png │ │ ├── icon-60.png │ │ ├── icon-76.png │ │ ├── icon-80.png │ │ ├── icon-87.png │ │ ├── icon20.png │ │ ├── icon-1024.png │ │ └── Contents.json ├── Localizable.strings ├── Source │ ├── Main │ │ └── CTMBMainViewController.swift │ ├── NSObject+AppKitGlue.swift │ └── Application │ │ ├── CTMBAppDelegate+Actions.swift │ │ ├── CTMBSceneDelegate.swift │ │ ├── CTMBSceneDelegate+NSToolbar.swift │ │ └── CTMBAppDelegate.swift ├── Info.plist └── Base.lproj │ └── LaunchScreen.storyboard ├── CatalystToolbarMenuButton.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj ├── README.md └── AppKitIntegration ├── AppKitIntegration.h └── AppKitController.swift /CatalystToolbarMenuButton/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-120.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-152.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-167.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-180.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-29.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-40.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-58.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-60.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-76.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-80.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-87.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon20.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steventroughtonsmith/CatalystToolbarMenuButton/HEAD/CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/icon-1024.png -------------------------------------------------------------------------------- /CatalystToolbarMenuButton.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | CatalystToolbarMenuButton 4 | 5 | Created by Steven Troughton-Smith on 09/04/2022. 6 | 7 | */ 8 | 9 | "TAKE_PHOTO" = "Take Photo"; 10 | "CHOOSE_FROM_LIBRARY" = "Choose from Library…"; 11 | "CHOOSE_FROM_FILE" = "Choose File…"; 12 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Source/Main/CTMBMainViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CTMBMainViewController.swift 3 | // CatalystToolbarMenuButton 4 | // 5 | // Created by Steven Troughton-Smith on 09/04/2022. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | final class CTMBMainViewController: UIViewController { 12 | 13 | init() { 14 | super.init(nibName: nil, bundle: nil) 15 | title = "CatalystToolbarMenuButton" 16 | } 17 | 18 | required init?(coder aDecoder: NSCoder) { 19 | fatalError("init(coder:) has not been implemented") 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Source/NSObject+AppKitGlue.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+AppKitGlue.swift 3 | // CatalystToolbarMenuButton 4 | // 5 | // Created by Steven Troughton-Smith on 09/04/2022. 6 | // 7 | 8 | import UIKit 9 | 10 | #if targetEnvironment(macCatalyst) 11 | import AppKit 12 | 13 | extension NSObject { 14 | @objc public func _marzipan_setupWindow(_ sender:Any) { 15 | 16 | } 17 | 18 | @objc public func createAddToolbarItem(itemIdentifier:NSToolbarItem.Identifier) -> NSToolbarItem { 19 | return NSToolbarItem(itemIdentifier: itemIdentifier) 20 | 21 | } 22 | } 23 | #endif 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CatalystToolbarMenuButton 2 | 3 | This is a simple Mac Catalyst example showcasing how to build a dropdown menu toolbar button using AppKit. 4 | 5 | There are ways to build this using NSToolbarItemGroup, but it has peculiarities like the button always being the width of the longest menu item, even when no title is shown. This way, instead, gives you an NSPopUpButton for your toolbar item, and lets you set an NSMenu of your own design to it. 6 | 7 | ### Screenshot 8 | 9 | ![https://hccdata.s3.amazonaws.com/gh_toolbarmenubutton.jpg](https://hccdata.s3.amazonaws.com/gh_toolbarmenubutton.jpg) 10 | -------------------------------------------------------------------------------- /AppKitIntegration/AppKitIntegration.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppKitIntegration.h 3 | // AppKitIntegration 4 | // 5 | // Created by Steven Troughton-Smith on 09/04/2022. 6 | // 7 | 8 | #import 9 | 10 | //! Project version number for AppKitIntegration. 11 | FOUNDATION_EXPORT double AppKitIntegrationVersionNumber; 12 | 13 | //! Project version string for AppKitIntegration. 14 | FOUNDATION_EXPORT const unsigned char AppKitIntegrationVersionString[]; 15 | 16 | // In this header, you should import all the public headers of your framework using statements like #import 17 | 18 | 19 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Source/Application/CTMBAppDelegate+Actions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CTMBAppDelegate.swift 3 | // CatalystToolbarMenuButton 4 | // 5 | // Created by Steven Troughton-Smith on 09/04/2022. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | extension CTMBAppDelegate { 12 | 13 | // MARK: - Actions 14 | 15 | @objc func addNewPhoto(_ sender:Any?) { 16 | 17 | } 18 | 19 | @objc func addExistingPhoto(_ sender:Any?) { 20 | 21 | } 22 | 23 | @objc func addFromFile(_ sender:Any?) { 24 | 25 | } 26 | 27 | // MARK: - Dynamic Options 28 | 29 | /* 30 | Demonstrating unavailable selector. 31 | Use responds(to:) to change availability of menu items at runtime 32 | */ 33 | override func responds(to aSelector: Selector!) -> Bool { 34 | if aSelector == NSSelectorFromString("addFromFile:") { 35 | return false 36 | } 37 | 38 | return super.responds(to: aSelector) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Source/Application/CTMBSceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CTMBSceneDelegate.swift 3 | // CatalystToolbarMenuButton 4 | // 5 | // Created by Steven Troughton-Smith on 09/04/2022. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | class CTMBSceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | var window: UIWindow? 13 | 14 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 15 | guard let windowScene = scene as? UIWindowScene else { 16 | fatalError("Expected scene of type UIWindowScene but got an unexpected type") 17 | } 18 | window = UIWindow(windowScene: windowScene) 19 | 20 | if let window = window { 21 | window.rootViewController = CTMBMainViewController() 22 | 23 | #if targetEnvironment(macCatalyst) 24 | 25 | let toolbar = NSToolbar(identifier: NSToolbar.Identifier("CTMBSceneDelegate.Toolbar")) 26 | toolbar.delegate = self 27 | toolbar.displayMode = .iconOnly 28 | toolbar.allowsUserCustomization = false 29 | 30 | windowScene.titlebar?.toolbar = toolbar 31 | windowScene.titlebar?.toolbarStyle = .unified 32 | 33 | #endif 34 | 35 | window.makeKeyAndVisible() 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Source/Application/CTMBSceneDelegate+NSToolbar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CTMBSceneDelegate+NSToolbar.swift 3 | // CatalystToolbarMenuButton 4 | // 5 | // Created by Steven Troughton-Smith on 09/04/2022. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | #if targetEnvironment(macCatalyst) 12 | import AppKit 13 | 14 | extension NSToolbarItem.Identifier { 15 | static let new = NSToolbarItem.Identifier("com.highcaffeinecontent.toolbar.new") 16 | } 17 | 18 | extension CTMBSceneDelegate: NSToolbarDelegate { 19 | 20 | func toolbarItems() -> [NSToolbarItem.Identifier] { 21 | return [.toggleSidebar, .flexibleSpace, .new] 22 | } 23 | 24 | func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { 25 | return toolbarItems() 26 | } 27 | 28 | func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { 29 | return toolbarItems() 30 | } 31 | 32 | func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { 33 | if itemIdentifier == .new { 34 | if let newItem = CTMBAppDelegate.appKitController?.createAddToolbarItem(itemIdentifier: itemIdentifier) { 35 | return newItem 36 | } 37 | else { 38 | return NSToolbarItem(itemIdentifier: itemIdentifier) 39 | } 40 | } 41 | 42 | return NSToolbarItem(itemIdentifier: itemIdentifier) 43 | } 44 | } 45 | #endif 46 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Source/Application/CTMBAppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CTMBAppDelegate.swift 3 | // CatalystToolbarMenuButton 4 | // 5 | // Created by Steven Troughton-Smith on 09/04/2022. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class CTMBAppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | // MARK: - AppKit Bundle Loading 15 | 16 | #if targetEnvironment(macCatalyst) 17 | static var appKitController:NSObject? 18 | 19 | class func loadAppKitIntegrationFramework() { 20 | 21 | if let frameworksPath = Bundle.main.privateFrameworksPath { 22 | let bundlePath = "\(frameworksPath)/AppKitIntegration.framework" 23 | do { 24 | try Bundle(path: bundlePath)?.loadAndReturnError() 25 | 26 | let bundle = Bundle(path: bundlePath)! 27 | NSLog("[APPKIT BUNDLE] Loaded Successfully") 28 | 29 | if let appKitControllerClass = bundle.principalClass as? NSObject.Type { 30 | appKitController = appKitControllerClass.init() 31 | 32 | NotificationCenter.default.addObserver(appKitController as Any, selector: #selector(_marzipan_setupWindow(_:)), name: NSNotification.Name("UISBHSDidCreateWindowForSceneNotification"), object: nil) 33 | } 34 | } 35 | catch { 36 | NSLog("[APPKIT BUNDLE] Error loading: \(error)") 37 | } 38 | } 39 | } 40 | #endif 41 | 42 | // MARK: - 43 | 44 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 45 | #if targetEnvironment(macCatalyst) 46 | CTMBAppDelegate.loadAppKitIntegrationFramework() 47 | #endif 48 | 49 | return true 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ITSAppUsesNonExemptEncryption 6 | 7 | LSRequiresIPhoneOS 8 | 9 | UIApplicationSceneManifest 10 | 11 | UIApplicationSupportsMultipleScenes 12 | 13 | UISceneConfigurations 14 | 15 | UIWindowSceneSessionRoleApplication 16 | 17 | 18 | UISceneConfigurationName 19 | Default Configuration 20 | UISceneDelegateClassName 21 | $(PRODUCT_MODULE_NAME).CTMBSceneDelegate 22 | 23 | 24 | 25 | 26 | UIApplicationSupportsIndirectInputEvents 27 | 28 | UILaunchStoryboardName 29 | LaunchScreen 30 | UIRequiredDeviceCapabilities 31 | 32 | armv7 33 | 34 | UISupportedInterfaceOrientations 35 | 36 | UIInterfaceOrientationPortrait 37 | UIInterfaceOrientationLandscapeLeft 38 | UIInterfaceOrientationLandscapeRight 39 | 40 | UISupportedInterfaceOrientations~ipad 41 | 42 | UIInterfaceOrientationPortrait 43 | UIInterfaceOrientationPortraitUpsideDown 44 | UIInterfaceOrientationLandscapeLeft 45 | UIInterfaceOrientationLandscapeRight 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /AppKitIntegration/AppKitController.swift: -------------------------------------------------------------------------------- 1 | /* 2 | 2021 Steven Troughton-Smith (@stroughtonsmith) 3 | Provided as sample code to do with as you wish. 4 | No license or attribution required. 5 | */ 6 | 7 | import AppKit 8 | 9 | extension NSObject { 10 | @objc func hostWindowForSceneIdentifier(_ identifier:String) -> NSWindow? { 11 | return nil 12 | } 13 | } 14 | 15 | class AppKitController : NSObject { 16 | 17 | @objc var uiAppDelegate:NSObject? = nil 18 | 19 | // MARK: - 20 | 21 | @objc public func _marzipan_setupWindow(_ note:Notification) { 22 | 23 | NSLog("_marzipan_setupWindow: \(String(describing: note.userInfo))") 24 | 25 | /* 26 | Here, AppKit has generated the host window for your UIKit window. 27 | Now it is safe to go do any AppKit-y things you'd like to do to it 28 | */ 29 | } 30 | } 31 | 32 | extension AppKitController { 33 | 34 | @objc public func createAddToolbarItem(itemIdentifier:NSToolbarItem.Identifier) -> NSToolbarItem { 35 | let item = NSToolbarItem(itemIdentifier: itemIdentifier) 36 | 37 | let menuButton = NSPopUpButton() 38 | 39 | menuButton.pullsDown = true 40 | menuButton.bezelStyle = .texturedRounded 41 | 42 | let menu = NSMenu() 43 | 44 | let rootItem = NSMenuItem(title: "", action: nil, keyEquivalent: "") 45 | rootItem.image = NSImage(systemSymbolName: "plus", accessibilityDescription: "")! 46 | 47 | menu.items.append(rootItem) 48 | 49 | do { 50 | let item = NSMenuItem(title: NSLocalizedString("TAKE_PHOTO", comment: ""), action: NSSelectorFromString("addNewPhoto:"), keyEquivalent: "") 51 | item.target = uiAppDelegate 52 | menu.items.append(item) 53 | } 54 | 55 | menu.items.append(.separator()) 56 | 57 | do { 58 | let item = NSMenuItem(title: NSLocalizedString("CHOOSE_FROM_LIBRARY", comment: ""), action: NSSelectorFromString("addExistingPhoto:"), keyEquivalent: "") 59 | item.target = uiAppDelegate 60 | menu.items.append(item) 61 | } 62 | 63 | do { 64 | let item = NSMenuItem(title: NSLocalizedString("CHOOSE_FROM_FILE", comment: ""), action: NSSelectorFromString("addFromFile:"), keyEquivalent: "") 65 | item.target = uiAppDelegate 66 | menu.items.append(item) 67 | } 68 | 69 | menuButton.menu = menu 70 | 71 | item.view = menuButton 72 | 73 | return item 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "size": "20x20", 5 | "idiom": "iphone", 6 | "filename": "icon-40.png", 7 | "scale": "2x" 8 | }, 9 | { 10 | "size": "20x20", 11 | "idiom": "iphone", 12 | "filename": "icon-60.png", 13 | "scale": "3x" 14 | }, 15 | { 16 | "size": "29x29", 17 | "idiom": "iphone", 18 | "filename": "icon-58.png", 19 | "scale": "2x" 20 | }, 21 | { 22 | "size": "29x29", 23 | "idiom": "iphone", 24 | "filename": "icon-87.png", 25 | "scale": "3x" 26 | }, 27 | { 28 | "size": "40x40", 29 | "idiom": "iphone", 30 | "filename": "icon-80.png", 31 | "scale": "2x" 32 | }, 33 | { 34 | "size": "40x40", 35 | "idiom": "iphone", 36 | "filename": "icon-120.png", 37 | "scale": "3x" 38 | }, 39 | { 40 | "size": "60x60", 41 | "idiom": "iphone", 42 | "filename": "icon-120.png", 43 | "scale": "2x" 44 | }, 45 | { 46 | "size": "60x60", 47 | "idiom": "iphone", 48 | "filename": "icon-180.png", 49 | "scale": "3x" 50 | }, 51 | { 52 | "size": "20x20", 53 | "idiom": "ipad", 54 | "filename": "icon20.png", 55 | "scale": "1x" 56 | }, 57 | { 58 | "size": "20x20", 59 | "idiom": "ipad", 60 | "filename": "icon-40.png", 61 | "scale": "2x" 62 | }, 63 | { 64 | "size": "29x29", 65 | "idiom": "ipad", 66 | "filename": "icon-29.png", 67 | "scale": "1x" 68 | }, 69 | { 70 | "size": "29x29", 71 | "idiom": "ipad", 72 | "filename": "icon-58.png", 73 | "scale": "2x" 74 | }, 75 | { 76 | "size": "40x40", 77 | "idiom": "ipad", 78 | "filename": "icon-40.png", 79 | "scale": "1x" 80 | }, 81 | { 82 | "size": "40x40", 83 | "idiom": "ipad", 84 | "filename": "icon-80.png", 85 | "scale": "2x" 86 | }, 87 | { 88 | "size": "76x76", 89 | "idiom": "ipad", 90 | "filename": "icon-76.png", 91 | "scale": "1x" 92 | }, 93 | { 94 | "size": "76x76", 95 | "idiom": "ipad", 96 | "filename": "icon-152.png", 97 | "scale": "2x" 98 | }, 99 | { 100 | "size": "83.5x83.5", 101 | "idiom": "ipad", 102 | "filename": "icon-167.png", 103 | "scale": "2x" 104 | }, 105 | { 106 | "size": "1024x1024", 107 | "idiom": "ios-marketing", 108 | "filename": "icon-1024.png", 109 | "scale": "1x" 110 | } 111 | ], 112 | "info": { 113 | "version": 1, 114 | "author": "xcode" 115 | } 116 | } -------------------------------------------------------------------------------- /CatalystToolbarMenuButton/Base.lproj/LaunchScreen.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 | -------------------------------------------------------------------------------- /CatalystToolbarMenuButton.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 55; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B010F4E62801EB6400C88F12 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B010F4E52801EB6400C88F12 /* Assets.xcassets */; }; 11 | B010F4EA2801EB6400C88F12 /* CTMBAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B010F4E92801EB6400C88F12 /* CTMBAppDelegate.swift */; }; 12 | B010F4EC2801EB6400C88F12 /* CTMBSceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B010F4EB2801EB6400C88F12 /* CTMBSceneDelegate.swift */; }; 13 | B010F4EE2801EB6400C88F12 /* CTMBSceneDelegate+NSToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B010F4ED2801EB6400C88F12 /* CTMBSceneDelegate+NSToolbar.swift */; }; 14 | B010F4F12801EB6400C88F12 /* CTMBMainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B010F4F02801EB6400C88F12 /* CTMBMainViewController.swift */; }; 15 | B010F4F42801EB6400C88F12 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B010F4F22801EB6400C88F12 /* LaunchScreen.storyboard */; }; 16 | B010F5032801EB8700C88F12 /* AppKitIntegration.h in Headers */ = {isa = PBXBuildFile; fileRef = B010F5022801EB8700C88F12 /* AppKitIntegration.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | B010F5082801EB8E00C88F12 /* AppKitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B010F5072801EB8E00C88F12 /* AppKitController.swift */; }; 18 | B010F50C2801EBA400C88F12 /* AppKitIntegration.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = B010F5002801EB8700C88F12 /* AppKitIntegration.framework */; platformFilter = maccatalyst; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 19 | B010F50E2801EBEA00C88F12 /* NSObject+AppKitGlue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B010F50D2801EBEA00C88F12 /* NSObject+AppKitGlue.swift */; }; 20 | B010F5102801ECBF00C88F12 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B010F50F2801ECBF00C88F12 /* Localizable.strings */; }; 21 | B010F5122801ED2900C88F12 /* CTMBAppDelegate+Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B010F5112801ED2900C88F12 /* CTMBAppDelegate+Actions.swift */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | B010F5092801EB9B00C88F12 /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = B010F4DA2801EB6400C88F12 /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = B010F4FF2801EB8700C88F12; 30 | remoteInfo = AppKitIntegration; 31 | }; 32 | /* End PBXContainerItemProxy section */ 33 | 34 | /* Begin PBXCopyFilesBuildPhase section */ 35 | B010F50B2801EB9E00C88F12 /* CopyFiles */ = { 36 | isa = PBXCopyFilesBuildPhase; 37 | buildActionMask = 2147483647; 38 | dstPath = ""; 39 | dstSubfolderSpec = 10; 40 | files = ( 41 | B010F50C2801EBA400C88F12 /* AppKitIntegration.framework in CopyFiles */, 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | /* End PBXCopyFilesBuildPhase section */ 46 | 47 | /* Begin PBXFileReference section */ 48 | B010F4E22801EB6400C88F12 /* CatalystToolbarMenuButton.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CatalystToolbarMenuButton.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | B010F4E52801EB6400C88F12 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 50 | B010F4E92801EB6400C88F12 /* CTMBAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CTMBAppDelegate.swift; sourceTree = ""; }; 51 | B010F4EB2801EB6400C88F12 /* CTMBSceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CTMBSceneDelegate.swift; sourceTree = ""; }; 52 | B010F4ED2801EB6400C88F12 /* CTMBSceneDelegate+NSToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CTMBSceneDelegate+NSToolbar.swift"; sourceTree = ""; }; 53 | B010F4F02801EB6400C88F12 /* CTMBMainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CTMBMainViewController.swift; sourceTree = ""; }; 54 | B010F4F32801EB6400C88F12 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 55 | B010F4F52801EB6400C88F12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | B010F5002801EB8700C88F12 /* AppKitIntegration.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppKitIntegration.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | B010F5022801EB8700C88F12 /* AppKitIntegration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppKitIntegration.h; sourceTree = ""; }; 58 | B010F5072801EB8E00C88F12 /* AppKitController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppKitController.swift; sourceTree = ""; }; 59 | B010F50D2801EBEA00C88F12 /* NSObject+AppKitGlue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSObject+AppKitGlue.swift"; sourceTree = ""; }; 60 | B010F50F2801ECBF00C88F12 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; 61 | B010F5112801ED2900C88F12 /* CTMBAppDelegate+Actions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CTMBAppDelegate+Actions.swift"; sourceTree = ""; }; 62 | B010F5132801EF1900C88F12 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 63 | /* End PBXFileReference section */ 64 | 65 | /* Begin PBXFrameworksBuildPhase section */ 66 | B010F4DF2801EB6400C88F12 /* Frameworks */ = { 67 | isa = PBXFrameworksBuildPhase; 68 | buildActionMask = 2147483647; 69 | files = ( 70 | ); 71 | runOnlyForDeploymentPostprocessing = 0; 72 | }; 73 | B010F4FD2801EB8700C88F12 /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | ); 78 | runOnlyForDeploymentPostprocessing = 0; 79 | }; 80 | /* End PBXFrameworksBuildPhase section */ 81 | 82 | /* Begin PBXGroup section */ 83 | B010F4D92801EB6400C88F12 = { 84 | isa = PBXGroup; 85 | children = ( 86 | B010F5132801EF1900C88F12 /* README.md */, 87 | B010F4E42801EB6400C88F12 /* CatalystToolbarMenuButton */, 88 | B010F5012801EB8700C88F12 /* AppKitIntegration */, 89 | B010F4E32801EB6400C88F12 /* Products */, 90 | ); 91 | sourceTree = ""; 92 | }; 93 | B010F4E32801EB6400C88F12 /* Products */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | B010F4E22801EB6400C88F12 /* CatalystToolbarMenuButton.app */, 97 | B010F5002801EB8700C88F12 /* AppKitIntegration.framework */, 98 | ); 99 | name = Products; 100 | sourceTree = ""; 101 | }; 102 | B010F4E42801EB6400C88F12 /* CatalystToolbarMenuButton */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | B010F4E52801EB6400C88F12 /* Assets.xcassets */, 106 | B010F4F22801EB6400C88F12 /* LaunchScreen.storyboard */, 107 | B010F4F52801EB6400C88F12 /* Info.plist */, 108 | B010F50F2801ECBF00C88F12 /* Localizable.strings */, 109 | B010F4E72801EB6400C88F12 /* Source */, 110 | ); 111 | path = CatalystToolbarMenuButton; 112 | sourceTree = ""; 113 | }; 114 | B010F4E72801EB6400C88F12 /* Source */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | B010F50D2801EBEA00C88F12 /* NSObject+AppKitGlue.swift */, 118 | B010F4E82801EB6400C88F12 /* Application */, 119 | B010F4EF2801EB6400C88F12 /* Main */, 120 | ); 121 | path = Source; 122 | sourceTree = ""; 123 | }; 124 | B010F4E82801EB6400C88F12 /* Application */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | B010F4E92801EB6400C88F12 /* CTMBAppDelegate.swift */, 128 | B010F5112801ED2900C88F12 /* CTMBAppDelegate+Actions.swift */, 129 | B010F4EB2801EB6400C88F12 /* CTMBSceneDelegate.swift */, 130 | B010F4ED2801EB6400C88F12 /* CTMBSceneDelegate+NSToolbar.swift */, 131 | ); 132 | path = Application; 133 | sourceTree = ""; 134 | }; 135 | B010F4EF2801EB6400C88F12 /* Main */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | B010F4F02801EB6400C88F12 /* CTMBMainViewController.swift */, 139 | ); 140 | path = Main; 141 | sourceTree = ""; 142 | }; 143 | B010F5012801EB8700C88F12 /* AppKitIntegration */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | B010F5022801EB8700C88F12 /* AppKitIntegration.h */, 147 | B010F5072801EB8E00C88F12 /* AppKitController.swift */, 148 | ); 149 | path = AppKitIntegration; 150 | sourceTree = ""; 151 | }; 152 | /* End PBXGroup section */ 153 | 154 | /* Begin PBXHeadersBuildPhase section */ 155 | B010F4FB2801EB8700C88F12 /* Headers */ = { 156 | isa = PBXHeadersBuildPhase; 157 | buildActionMask = 2147483647; 158 | files = ( 159 | B010F5032801EB8700C88F12 /* AppKitIntegration.h in Headers */, 160 | ); 161 | runOnlyForDeploymentPostprocessing = 0; 162 | }; 163 | /* End PBXHeadersBuildPhase section */ 164 | 165 | /* Begin PBXNativeTarget section */ 166 | B010F4E12801EB6400C88F12 /* CatalystToolbarMenuButton */ = { 167 | isa = PBXNativeTarget; 168 | buildConfigurationList = B010F4F82801EB6400C88F12 /* Build configuration list for PBXNativeTarget "CatalystToolbarMenuButton" */; 169 | buildPhases = ( 170 | B010F4DE2801EB6400C88F12 /* Sources */, 171 | B010F4DF2801EB6400C88F12 /* Frameworks */, 172 | B010F4E02801EB6400C88F12 /* Resources */, 173 | B010F50B2801EB9E00C88F12 /* CopyFiles */, 174 | ); 175 | buildRules = ( 176 | ); 177 | dependencies = ( 178 | B010F50A2801EB9B00C88F12 /* PBXTargetDependency */, 179 | ); 180 | name = CatalystToolbarMenuButton; 181 | productName = CatalystToolbarMenuButton; 182 | productReference = B010F4E22801EB6400C88F12 /* CatalystToolbarMenuButton.app */; 183 | productType = "com.apple.product-type.application"; 184 | }; 185 | B010F4FF2801EB8700C88F12 /* AppKitIntegration */ = { 186 | isa = PBXNativeTarget; 187 | buildConfigurationList = B010F5042801EB8700C88F12 /* Build configuration list for PBXNativeTarget "AppKitIntegration" */; 188 | buildPhases = ( 189 | B010F4FB2801EB8700C88F12 /* Headers */, 190 | B010F4FC2801EB8700C88F12 /* Sources */, 191 | B010F4FD2801EB8700C88F12 /* Frameworks */, 192 | B010F4FE2801EB8700C88F12 /* Resources */, 193 | ); 194 | buildRules = ( 195 | ); 196 | dependencies = ( 197 | ); 198 | name = AppKitIntegration; 199 | productName = AppKitIntegration; 200 | productReference = B010F5002801EB8700C88F12 /* AppKitIntegration.framework */; 201 | productType = "com.apple.product-type.framework"; 202 | }; 203 | /* End PBXNativeTarget section */ 204 | 205 | /* Begin PBXProject section */ 206 | B010F4DA2801EB6400C88F12 /* Project object */ = { 207 | isa = PBXProject; 208 | attributes = { 209 | BuildIndependentTargetsInParallel = 1; 210 | CLASSPREFIX = CTMB; 211 | LastSwiftUpdateCheck = 1330; 212 | LastUpgradeCheck = 1330; 213 | TargetAttributes = { 214 | B010F4E12801EB6400C88F12 = { 215 | CreatedOnToolsVersion = 13.3; 216 | }; 217 | B010F4FF2801EB8700C88F12 = { 218 | CreatedOnToolsVersion = 13.3; 219 | LastSwiftMigration = 1330; 220 | }; 221 | }; 222 | }; 223 | buildConfigurationList = B010F4DD2801EB6400C88F12 /* Build configuration list for PBXProject "CatalystToolbarMenuButton" */; 224 | compatibilityVersion = "Xcode 13.0"; 225 | developmentRegion = en; 226 | hasScannedForEncodings = 0; 227 | knownRegions = ( 228 | en, 229 | Base, 230 | ); 231 | mainGroup = B010F4D92801EB6400C88F12; 232 | productRefGroup = B010F4E32801EB6400C88F12 /* Products */; 233 | projectDirPath = ""; 234 | projectRoot = ""; 235 | targets = ( 236 | B010F4E12801EB6400C88F12 /* CatalystToolbarMenuButton */, 237 | B010F4FF2801EB8700C88F12 /* AppKitIntegration */, 238 | ); 239 | }; 240 | /* End PBXProject section */ 241 | 242 | /* Begin PBXResourcesBuildPhase section */ 243 | B010F4E02801EB6400C88F12 /* Resources */ = { 244 | isa = PBXResourcesBuildPhase; 245 | buildActionMask = 2147483647; 246 | files = ( 247 | B010F4E62801EB6400C88F12 /* Assets.xcassets in Resources */, 248 | B010F5102801ECBF00C88F12 /* Localizable.strings in Resources */, 249 | B010F4F42801EB6400C88F12 /* LaunchScreen.storyboard in Resources */, 250 | ); 251 | runOnlyForDeploymentPostprocessing = 0; 252 | }; 253 | B010F4FE2801EB8700C88F12 /* Resources */ = { 254 | isa = PBXResourcesBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | /* End PBXResourcesBuildPhase section */ 261 | 262 | /* Begin PBXSourcesBuildPhase section */ 263 | B010F4DE2801EB6400C88F12 /* Sources */ = { 264 | isa = PBXSourcesBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | B010F4EA2801EB6400C88F12 /* CTMBAppDelegate.swift in Sources */, 268 | B010F4F12801EB6400C88F12 /* CTMBMainViewController.swift in Sources */, 269 | B010F5122801ED2900C88F12 /* CTMBAppDelegate+Actions.swift in Sources */, 270 | B010F50E2801EBEA00C88F12 /* NSObject+AppKitGlue.swift in Sources */, 271 | B010F4EE2801EB6400C88F12 /* CTMBSceneDelegate+NSToolbar.swift in Sources */, 272 | B010F4EC2801EB6400C88F12 /* CTMBSceneDelegate.swift in Sources */, 273 | ); 274 | runOnlyForDeploymentPostprocessing = 0; 275 | }; 276 | B010F4FC2801EB8700C88F12 /* Sources */ = { 277 | isa = PBXSourcesBuildPhase; 278 | buildActionMask = 2147483647; 279 | files = ( 280 | B010F5082801EB8E00C88F12 /* AppKitController.swift in Sources */, 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | }; 284 | /* End PBXSourcesBuildPhase section */ 285 | 286 | /* Begin PBXTargetDependency section */ 287 | B010F50A2801EB9B00C88F12 /* PBXTargetDependency */ = { 288 | isa = PBXTargetDependency; 289 | platformFilter = maccatalyst; 290 | target = B010F4FF2801EB8700C88F12 /* AppKitIntegration */; 291 | targetProxy = B010F5092801EB9B00C88F12 /* PBXContainerItemProxy */; 292 | }; 293 | /* End PBXTargetDependency section */ 294 | 295 | /* Begin PBXVariantGroup section */ 296 | B010F4F22801EB6400C88F12 /* LaunchScreen.storyboard */ = { 297 | isa = PBXVariantGroup; 298 | children = ( 299 | B010F4F32801EB6400C88F12 /* Base */, 300 | ); 301 | name = LaunchScreen.storyboard; 302 | sourceTree = ""; 303 | }; 304 | /* End PBXVariantGroup section */ 305 | 306 | /* Begin XCBuildConfiguration section */ 307 | B010F4F62801EB6400C88F12 /* Debug */ = { 308 | isa = XCBuildConfiguration; 309 | buildSettings = { 310 | ALWAYS_SEARCH_USER_PATHS = NO; 311 | CLANG_ANALYZER_NONNULL = YES; 312 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 313 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 314 | CLANG_ENABLE_MODULES = YES; 315 | CLANG_ENABLE_OBJC_ARC = YES; 316 | CLANG_ENABLE_OBJC_WEAK = YES; 317 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 318 | CLANG_WARN_BOOL_CONVERSION = YES; 319 | CLANG_WARN_COMMA = YES; 320 | CLANG_WARN_CONSTANT_CONVERSION = YES; 321 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 322 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 323 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 324 | CLANG_WARN_EMPTY_BODY = YES; 325 | CLANG_WARN_ENUM_CONVERSION = YES; 326 | CLANG_WARN_INFINITE_RECURSION = YES; 327 | CLANG_WARN_INT_CONVERSION = YES; 328 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 329 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 330 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 331 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 332 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 334 | CLANG_WARN_STRICT_PROTOTYPES = YES; 335 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 336 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 337 | CLANG_WARN_UNREACHABLE_CODE = YES; 338 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 339 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 340 | COPY_PHASE_STRIP = NO; 341 | DEBUG_INFORMATION_FORMAT = dwarf; 342 | ENABLE_STRICT_OBJC_MSGSEND = YES; 343 | ENABLE_TESTABILITY = YES; 344 | GCC_C_LANGUAGE_STANDARD = gnu11; 345 | GCC_DYNAMIC_NO_PIC = NO; 346 | GCC_NO_COMMON_BLOCKS = YES; 347 | GCC_OPTIMIZATION_LEVEL = 0; 348 | GCC_PREPROCESSOR_DEFINITIONS = ( 349 | "DEBUG=1", 350 | "$(inherited)", 351 | ); 352 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 353 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 354 | GCC_WARN_UNDECLARED_SELECTOR = YES; 355 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 356 | GCC_WARN_UNUSED_FUNCTION = YES; 357 | GCC_WARN_UNUSED_VARIABLE = YES; 358 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 359 | MTL_FAST_MATH = YES; 360 | ONLY_ACTIVE_ARCH = YES; 361 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 362 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 363 | SWIFT_VERSION = 5.0; 364 | }; 365 | name = Debug; 366 | }; 367 | B010F4F72801EB6400C88F12 /* Release */ = { 368 | isa = XCBuildConfiguration; 369 | buildSettings = { 370 | ALWAYS_SEARCH_USER_PATHS = NO; 371 | CLANG_ANALYZER_NONNULL = YES; 372 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 373 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 374 | CLANG_ENABLE_MODULES = YES; 375 | CLANG_ENABLE_OBJC_ARC = YES; 376 | CLANG_ENABLE_OBJC_WEAK = YES; 377 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 378 | CLANG_WARN_BOOL_CONVERSION = YES; 379 | CLANG_WARN_COMMA = YES; 380 | CLANG_WARN_CONSTANT_CONVERSION = YES; 381 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 382 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 383 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 384 | CLANG_WARN_EMPTY_BODY = YES; 385 | CLANG_WARN_ENUM_CONVERSION = YES; 386 | CLANG_WARN_INFINITE_RECURSION = YES; 387 | CLANG_WARN_INT_CONVERSION = YES; 388 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 389 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 390 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 391 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 392 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 393 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 394 | CLANG_WARN_STRICT_PROTOTYPES = YES; 395 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 396 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 397 | CLANG_WARN_UNREACHABLE_CODE = YES; 398 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 399 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 400 | COPY_PHASE_STRIP = NO; 401 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 402 | ENABLE_NS_ASSERTIONS = NO; 403 | ENABLE_STRICT_OBJC_MSGSEND = YES; 404 | GCC_C_LANGUAGE_STANDARD = gnu11; 405 | GCC_NO_COMMON_BLOCKS = YES; 406 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 407 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 408 | GCC_WARN_UNDECLARED_SELECTOR = YES; 409 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 410 | GCC_WARN_UNUSED_FUNCTION = YES; 411 | GCC_WARN_UNUSED_VARIABLE = YES; 412 | MTL_ENABLE_DEBUG_INFO = NO; 413 | MTL_FAST_MATH = YES; 414 | SWIFT_COMPILATION_MODE = wholemodule; 415 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 416 | SWIFT_VERSION = 5.0; 417 | }; 418 | name = Release; 419 | }; 420 | B010F4F92801EB6400C88F12 /* Debug */ = { 421 | isa = XCBuildConfiguration; 422 | buildSettings = { 423 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 424 | CLANG_STATIC_ANALYZER_MODE = deep; 425 | CODE_SIGN_IDENTITY = "iPhone Developer"; 426 | CODE_SIGN_STYLE = Automatic; 427 | CURRENT_PROJECT_VERSION = 1; 428 | DEVELOPMENT_TEAM = 2ZDN69KUUV; 429 | GCC_TREAT_WARNINGS_AS_ERRORS = deep; 430 | GCC_WARN_PEDANTIC = deep; 431 | GENERATE_INFOPLIST_FILE = YES; 432 | INFOPLIST_FILE = "$(PRODUCT_NAME)/Info.plist"; 433 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 434 | "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; 435 | LD_RUNPATH_SEARCH_PATHS = ( 436 | "$(inherited)", 437 | "@executable_path/Frameworks", 438 | ); 439 | MARKETING_VERSION = 1.0; 440 | PRODUCT_BUNDLE_IDENTIFIER = com.highcaffeinecontent.CatalystToolbarMenuButton; 441 | PRODUCT_NAME = CatalystToolbarMenuButton; 442 | RUN_CLANG_STATIC_ANALYZER = YES; 443 | SDKROOT = iphoneos; 444 | SUPPORTS_MACCATALYST = YES; 445 | SWIFT_EMIT_LOC_STRINGS = YES; 446 | SWIFT_TREAT_WARNINGS_AS_ERRORS = YES; 447 | SWIFT_VERSION = 5.0; 448 | TARGETED_DEVICE_FAMILY = "1,2,6"; 449 | }; 450 | name = Debug; 451 | }; 452 | B010F4FA2801EB6400C88F12 /* Release */ = { 453 | isa = XCBuildConfiguration; 454 | buildSettings = { 455 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 456 | CLANG_STATIC_ANALYZER_MODE = deep; 457 | CODE_SIGN_IDENTITY = "iPhone Developer"; 458 | CODE_SIGN_STYLE = Automatic; 459 | CURRENT_PROJECT_VERSION = 1; 460 | DEVELOPMENT_TEAM = 2ZDN69KUUV; 461 | GCC_TREAT_WARNINGS_AS_ERRORS = deep; 462 | GCC_WARN_PEDANTIC = deep; 463 | GENERATE_INFOPLIST_FILE = YES; 464 | INFOPLIST_FILE = "$(PRODUCT_NAME)/Info.plist"; 465 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 466 | "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.2; 467 | LD_RUNPATH_SEARCH_PATHS = ( 468 | "$(inherited)", 469 | "@executable_path/Frameworks", 470 | ); 471 | MARKETING_VERSION = 1.0; 472 | PRODUCT_BUNDLE_IDENTIFIER = com.highcaffeinecontent.CatalystToolbarMenuButton; 473 | PRODUCT_NAME = CatalystToolbarMenuButton; 474 | RUN_CLANG_STATIC_ANALYZER = YES; 475 | SDKROOT = iphoneos; 476 | SUPPORTS_MACCATALYST = YES; 477 | SWIFT_EMIT_LOC_STRINGS = YES; 478 | SWIFT_TREAT_WARNINGS_AS_ERRORS = YES; 479 | SWIFT_VERSION = 5.0; 480 | TARGETED_DEVICE_FAMILY = "1,2,6"; 481 | VALIDATE_PRODUCT = YES; 482 | }; 483 | name = Release; 484 | }; 485 | B010F5052801EB8700C88F12 /* Debug */ = { 486 | isa = XCBuildConfiguration; 487 | buildSettings = { 488 | CLANG_ENABLE_MODULES = YES; 489 | CODE_SIGN_STYLE = Automatic; 490 | COMBINE_HIDPI_IMAGES = YES; 491 | CURRENT_PROJECT_VERSION = 1; 492 | DEFINES_MODULE = YES; 493 | DEVELOPMENT_TEAM = 2ZDN69KUUV; 494 | DYLIB_COMPATIBILITY_VERSION = 1; 495 | DYLIB_CURRENT_VERSION = 1; 496 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 497 | GENERATE_INFOPLIST_FILE = YES; 498 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 499 | INFOPLIST_KEY_NSPrincipalClass = "$(PRODUCT_MODULE_NAME).AppKitController"; 500 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 501 | LD_RUNPATH_SEARCH_PATHS = ( 502 | "$(inherited)", 503 | "@executable_path/../Frameworks", 504 | "@loader_path/Frameworks", 505 | ); 506 | MACOSX_DEPLOYMENT_TARGET = 12.3; 507 | MARKETING_VERSION = 1.0; 508 | PRODUCT_BUNDLE_IDENTIFIER = com.highcaffeinecontent.AppKitIntegration; 509 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 510 | SDKROOT = macosx; 511 | SKIP_INSTALL = YES; 512 | SWIFT_EMIT_LOC_STRINGS = YES; 513 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 514 | SWIFT_VERSION = 5.0; 515 | VERSIONING_SYSTEM = "apple-generic"; 516 | VERSION_INFO_PREFIX = ""; 517 | }; 518 | name = Debug; 519 | }; 520 | B010F5062801EB8700C88F12 /* Release */ = { 521 | isa = XCBuildConfiguration; 522 | buildSettings = { 523 | CLANG_ENABLE_MODULES = YES; 524 | CODE_SIGN_STYLE = Automatic; 525 | COMBINE_HIDPI_IMAGES = YES; 526 | CURRENT_PROJECT_VERSION = 1; 527 | DEFINES_MODULE = YES; 528 | DEVELOPMENT_TEAM = 2ZDN69KUUV; 529 | DYLIB_COMPATIBILITY_VERSION = 1; 530 | DYLIB_CURRENT_VERSION = 1; 531 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 532 | GENERATE_INFOPLIST_FILE = YES; 533 | INFOPLIST_KEY_NSHumanReadableCopyright = ""; 534 | INFOPLIST_KEY_NSPrincipalClass = "$(PRODUCT_MODULE_NAME).AppKitController"; 535 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 536 | LD_RUNPATH_SEARCH_PATHS = ( 537 | "$(inherited)", 538 | "@executable_path/../Frameworks", 539 | "@loader_path/Frameworks", 540 | ); 541 | MACOSX_DEPLOYMENT_TARGET = 12.3; 542 | MARKETING_VERSION = 1.0; 543 | PRODUCT_BUNDLE_IDENTIFIER = com.highcaffeinecontent.AppKitIntegration; 544 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 545 | SDKROOT = macosx; 546 | SKIP_INSTALL = YES; 547 | SWIFT_EMIT_LOC_STRINGS = YES; 548 | SWIFT_VERSION = 5.0; 549 | VERSIONING_SYSTEM = "apple-generic"; 550 | VERSION_INFO_PREFIX = ""; 551 | }; 552 | name = Release; 553 | }; 554 | /* End XCBuildConfiguration section */ 555 | 556 | /* Begin XCConfigurationList section */ 557 | B010F4DD2801EB6400C88F12 /* Build configuration list for PBXProject "CatalystToolbarMenuButton" */ = { 558 | isa = XCConfigurationList; 559 | buildConfigurations = ( 560 | B010F4F62801EB6400C88F12 /* Debug */, 561 | B010F4F72801EB6400C88F12 /* Release */, 562 | ); 563 | defaultConfigurationIsVisible = 0; 564 | defaultConfigurationName = Release; 565 | }; 566 | B010F4F82801EB6400C88F12 /* Build configuration list for PBXNativeTarget "CatalystToolbarMenuButton" */ = { 567 | isa = XCConfigurationList; 568 | buildConfigurations = ( 569 | B010F4F92801EB6400C88F12 /* Debug */, 570 | B010F4FA2801EB6400C88F12 /* Release */, 571 | ); 572 | defaultConfigurationIsVisible = 0; 573 | defaultConfigurationName = Release; 574 | }; 575 | B010F5042801EB8700C88F12 /* Build configuration list for PBXNativeTarget "AppKitIntegration" */ = { 576 | isa = XCConfigurationList; 577 | buildConfigurations = ( 578 | B010F5052801EB8700C88F12 /* Debug */, 579 | B010F5062801EB8700C88F12 /* Release */, 580 | ); 581 | defaultConfigurationIsVisible = 0; 582 | defaultConfigurationName = Release; 583 | }; 584 | /* End XCConfigurationList section */ 585 | }; 586 | rootObject = B010F4DA2801EB6400C88F12 /* Project object */; 587 | } 588 | --------------------------------------------------------------------------------