├── .gitignore ├── BTTDisplayNotificationActionPlugin ├── BTTDisplayNotificationActionPlugin-Bridging-Header.h ├── Info.plist ├── ShowNotificationPlugin.swift ├── icon.png └── icon@2x.png ├── BTTPluginSupport ├── BTTFormConstants.h ├── BTTFormConstants.m ├── BTTPluginFormItem.h ├── BTTPluginFormItem.m ├── BTTPluginSupport.h └── Info.plist ├── BTTStreamDeckPluginCPUUsage ├── BTTStreamDeckPluginCPUUsage-Bridging-Header.h ├── CPUUsagePlugin.swift ├── Info.plist ├── MyCpuUsage.swift ├── icon.png └── icon@2x.png ├── BTTTouchBarPluginSampleCustomString ├── BTTTouchBarPluginSampleCustomString-Bridging-Header.h ├── Info.plist ├── SamplePluginCustomString.swift ├── icon.png └── icon@2x.png ├── BTTTouchBarPluginSampleCustomView ├── BTTTouchBarPluginSampleCustomView-Bridging-Header.h ├── CustomViewVC.swift ├── Info.plist ├── SamplePluginCustomView.swift ├── icon.png └── icon@2x.png ├── BTTTouchBarSampleCustomButton ├── BTTTouchBarSampleCustomButton-Bridging-Header.h ├── Info.plist ├── SamplePluginCustomButton.swift ├── icon.png └── icon@2x.png ├── BetterTouchToolPluginDevelopment.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── andi.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcshareddata │ └── xcschemes │ │ └── BTTStreamDeckPluginCPUUsage.xcscheme └── xcuserdata │ └── andi.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ └── xcschememanagement.plist ├── BetterTouchToolPluginDevelopment ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── BTTPluginInterface.h ├── Base.lproj │ └── Main.storyboard ├── BetterTouchToolPluginDevelopment.entitlements ├── DemoTouchBarViewController.h ├── DemoTouchBarViewController.m ├── Info.plist ├── ViewController.h ├── ViewController.m ├── WindowController.h ├── WindowController.m └── main.m ├── LICENSE ├── README.md └── x.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Specify filepatterns you want git to ignore. 2 | node_modules 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /BTTDisplayNotificationActionPlugin/BTTDisplayNotificationActionPlugin-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 | 5 | #import "BTTPluginInterface.h" 6 | #import "BTTFormConstants.h" 7 | #import "BTTPluginFormItem.h" 8 | -------------------------------------------------------------------------------- /BTTDisplayNotificationActionPlugin/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleVersion 18 | 1 19 | NSHumanReadableCopyright 20 | Copyright © 2020 Andreas Hegenberg. All rights reserved. 21 | NSPrincipalClass 22 | $(PRODUCT_MODULE_NAME).DisplayNotificationPlugin 23 | BTTPluginIdentifier 24 | BTTDisplayNotification 25 | BTTPluginName 26 | Display Notification Plugin 27 | BTTPluginIcon 28 | icon 29 | CFBundlePackageType 30 | BNDL 31 | BTTPluginType 32 | Action 33 | 34 | 35 | -------------------------------------------------------------------------------- /BTTDisplayNotificationActionPlugin/ShowNotificationPlugin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShowNotificationPlugin.swift 3 | // BTTDisplayNotificationActionPlugin 4 | // 5 | // Created by Andreas Hegenberg on 19.01.20. 6 | // Copyright © 2020 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AppKit 11 | 12 | @objc class ShowNotificationPlugin : NSObject, BTTActionPluginInterface 13 | { 14 | static func configurationFormItems() -> BTTPluginFormItem? { 15 | let group = BTTPluginFormItem.init(); 16 | group.formFieldType = BTTFormTypeFormGroup; 17 | 18 | 19 | // here we just create a text field, we will receive the 20 | // current value in didReceiveNewConfigurationValues 21 | let item = BTTPluginFormItem.init(); 22 | item.formFieldType = BTTFormTypeTextField; 23 | item.formLabel1 = "Notification Title"; 24 | item.formFieldID = "notificationTitle"; 25 | 26 | let item2 = BTTPluginFormItem.init(); 27 | item2.formFieldType = BTTFormTypeTextField; 28 | item2.formLabel1 = "Notification Subtitle"; 29 | item2.formFieldID = "notificationSubtitle"; 30 | 31 | let item3 = BTTPluginFormItem.init(); 32 | item3.formFieldType = BTTFormTypeTextField; 33 | item3.formLabel1 = "Notification Sound Name"; 34 | item3.formFieldID = "notificationSoundName"; 35 | item3.defaultValue = NSUserNotificationDefaultSoundName; 36 | 37 | let iconPicker = BTTPluginFormItem.init(); 38 | iconPicker.formFieldType = BTTFormTypeImagePicker; 39 | iconPicker.formFieldID = "notificationIcon"; 40 | iconPicker.formLabel1 = "Icon:"; 41 | 42 | group.formOptions = [item,item2, item3, iconPicker]; 43 | return group; 44 | } 45 | 46 | static func actionName(withConfiguration configurationValues: [AnyHashable : Any]?)-> String? { 47 | let titleString = configurationValues?["plugin_var_notificationTitle"] as! String? ?? ""; 48 | return "Show Notification " + titleString ; 49 | } 50 | 51 | func executeAction(withConfiguration configurationValues: [AnyHashable : Any]?, completionBlock actionExecutedWithResult: ((Any?) -> Void)!) { 52 | 53 | 54 | if(configurationValues != nil) { 55 | 56 | let titleString = configurationValues?["plugin_var_notificationTitle"]; 57 | let subtitleString = configurationValues?["plugin_var_notificationSubtitle"]; 58 | let soundName = configurationValues?["plugin_var_notificationSoundName"]; 59 | 60 | // things like images always come back as base64 string 61 | let iconStringBase64 = configurationValues?["plugin_var_notificationIcon"]; 62 | 63 | 64 | let notification = NSUserNotification() 65 | 66 | 67 | if(iconStringBase64 != nil) { 68 | let iconData = Data.init(base64Encoded: iconStringBase64 as! String, options: []) ?? nil; 69 | 70 | if(iconData != nil) { 71 | var icon: NSImage? = nil; 72 | if(iconData != nil) { 73 | icon = NSImage.init(data: iconData!); 74 | notification.contentImage = icon; 75 | } 76 | } 77 | } 78 | 79 | 80 | notification.title = titleString as? String 81 | notification.subtitle = subtitleString as? String 82 | notification.soundName = soundName as? String 83 | NSUserNotificationCenter.default.deliver(notification) 84 | } 85 | 86 | } 87 | } 88 | 89 | -------------------------------------------------------------------------------- /BTTDisplayNotificationActionPlugin/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTDisplayNotificationActionPlugin/icon.png -------------------------------------------------------------------------------- /BTTDisplayNotificationActionPlugin/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTDisplayNotificationActionPlugin/icon@2x.png -------------------------------------------------------------------------------- /BTTPluginSupport/BTTFormConstants.h: -------------------------------------------------------------------------------- 1 | // 2 | // BTTFormConstants.h 3 | // BTTSamplePlugin 4 | // 5 | // Created by Andreas Hegenberg on 20.06.19. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface BTTFormConstants : NSObject 13 | 14 | extern NSString * const BTTFormType; 15 | extern NSString * const BTTFormDefault ; 16 | extern NSString * const BTTFormDataType ; 17 | extern NSString * const BTTFormKeyPath; 18 | extern NSString * const BTTFormOptions; 19 | extern NSString * const BTTFormShouldTriggerReload; 20 | 21 | extern NSString * const BTTFormTypeCheckbox; 22 | extern NSString * const BTTFormTypeTextField; 23 | extern NSString * const BTTFormTypeTwoTextFields; 24 | extern NSString * const BTTFormTypeTextArea; 25 | extern NSString * const BTTFormTypeTitleField; 26 | 27 | extern NSString * const BTTFormTypeDetailTitleField; 28 | extern NSString * const BTTFormTypePopupButton; 29 | extern NSString * const BTTFormTypeSlider; 30 | 31 | extern NSString * const BTTFormLabel1; 32 | extern NSString * const BTTFormLabel2; 33 | extern NSString * const BTTFormLabel3; 34 | extern NSString * const BTTFormMinValue; 35 | extern NSString * const BTTFormMaxValue; 36 | extern NSString * const BTTFormOption; 37 | extern NSString * const BTTFormSaveBlock; 38 | extern NSString * const BTTFormIsHiddenBlock; 39 | extern NSString * const BTTFormIsDisabledBlock; 40 | extern NSString * const BTTFormLoadingBlock; 41 | extern NSString * const BTTFormTypeSelectorPopover; 42 | extern NSString * const BTTFormTypeModifiers; 43 | extern NSString * const BTTFormTypeSeparator; 44 | extern NSString * const BTTFormShortcutRecorder; 45 | extern NSString * const BTTFormTypeNoAction; 46 | extern NSString * const BTTFormTypeColorPicker; 47 | extern NSString * const BTTFormTypeImagePicker; 48 | extern NSString * const BTTFormTypeFormGroup; 49 | extern NSString * const BTTFormTypeAppleScript; 50 | extern NSString * const BTTFormTypeShellScript; 51 | extern NSString * const BTTFormTypeButton; 52 | extern NSString * const BTTFormTypeCustomTextInsertDropDown; 53 | extern NSString * const BTTFormTypeMouseClickRecognizer; 54 | extern NSString * const BTTFormTypeScalingBezierPath; 55 | 56 | extern NSString * const BTTFormTypeDescription; 57 | extern NSString * const BTTFormTypeTabs; 58 | extern NSString * const BTTFormDataType; 59 | extern NSString * const BTTFormFieldID; 60 | typedef enum { 61 | BTTFormDataString = 1, 62 | BTTFormDataNumber = 2, 63 | BTTFormDataJSON = 3, 64 | BTTFormDataIcon= 5, 65 | BTTFormDataData = 6 66 | 67 | 68 | } BTTFormData; 69 | 70 | @end 71 | 72 | NS_ASSUME_NONNULL_END 73 | -------------------------------------------------------------------------------- /BTTPluginSupport/BTTFormConstants.m: -------------------------------------------------------------------------------- 1 | // 2 | // BTTFormConstants.m 3 | // BTTSamplePlugin 4 | // 5 | // Created by Andreas Hegenberg on 20.06.19. 6 | // 7 | 8 | #import "BTTFormConstants.h" 9 | 10 | @implementation BTTFormConstants 11 | 12 | NSString * const BTTFormConfigItems = @"BTTFormConfigItems"; 13 | NSString * const BTTFormConfigAppearanceTab = @"BTTFormConfigAppearanceTab"; 14 | NSString * const BTTFormConfigAdvancedTab = @"BTTFormConfigAdvancedTab"; 15 | NSString * const BTTFormFieldID = @"BTTFormFieldID"; 16 | NSString * const BTTFormSaveBlock = @"BTTFormSaveBlock"; 17 | NSString * const BTTFormIsHiddenBlock = @"BTTFormIsHiddenBlock"; 18 | NSString * const BTTFormIsDisabledBlock = @"BTTFormIsDisabledBlock"; 19 | NSString * const BTTFormLoadingBlock = @"BTTFormLoadingBlock"; 20 | NSString * const BTTFormType = @"BTTFormType"; 21 | NSString * const BTTFormOptions = @"BTTFormOptions"; 22 | NSString * const BTTFormOption = @"BTTFormOption"; 23 | NSString * const BTTFormDataType = @"BTTFormDataType"; 24 | NSString * const BTTFormDefault = @"BTTFormDefault"; 25 | NSString * const BTTFormKeyPath= @"BTTFormKeyPath"; 26 | NSString * const BTTFormLabel1 = @"BTTFormLabel1"; 27 | NSString * const BTTFormLabel2 = @"BTTFormLabel2"; 28 | NSString * const BTTFormLabel3 = @"BTTFormLabel3"; 29 | NSString * const BTTFormMinValue = @"BTTFormMinValue"; 30 | NSString * const BTTFormMaxValue = @"BTTFormMaxValue"; 31 | NSString * const BTTFormShouldTriggerReload = @"BTTFormShouldTriggerReload"; 32 | NSString * const BTTFormTypeColorPicker = @"BTTFormColorPicker"; 33 | NSString * const BTTFormTypeDescription = @"BTTFormDescription"; 34 | NSString * const BTTFormTypeTabs = @"BTTFormTabs"; 35 | NSString * const BTTFormTypeModifiers = @"BTTFormModifiers"; 36 | NSString * const BTTFormTypeCheckbox = @"BTTFormCheckbox"; 37 | NSString * const BTTFormTypeTextField = @"BTTFormTextField"; 38 | NSString * const BTTFormTypeTwoTextFields = @"BTTFormTwoTextFields"; 39 | NSString * const BTTFormTypeTextArea = @"BTTFormTextArea"; 40 | NSString * const BTTFormTypeTitleField = @"BTTFormTitleField"; 41 | NSString * const BTTFormTypeDetailTitleField = @"BTTFormTypeDetailTitleField"; 42 | NSString * const BTTFormTypeScalingBezierPath = @"BTTFormScalingBezierPath"; 43 | NSString * const BTTFormTypePopupButton = @"BTTFormPopupButton"; 44 | NSString * const BTTFormTypeSlider = @"BTTFormSlider"; 45 | NSString * const BTTFormTypeSelectorPopover = @"BTTFormSelectorPopover"; 46 | NSString * const BTTFormShortcutRecorder = @"BTTFormShortcutRecorder"; 47 | NSString * const BTTFormTypeNoAction = @"BTTFormTypeNoAction"; 48 | NSString * const BTTFormTypeImagePicker = @"BTTFormImagePicker"; 49 | NSString * const BTTFormTypeFormGroup= @"BTTFormGroup"; 50 | NSString * const BTTFormTypeAppleScript = @"BTTFormAppleScript"; 51 | NSString * const BTTFormTypeShellScript = @"BTTFormShellScript"; 52 | NSString * const BTTFormTypeButton = @"BTTFormButton"; 53 | NSString * const BTTFormTypeCustomTextInsertDropDown = @"BTTFormCustomTextInsertDropDown"; 54 | NSString * const BTTFormTypeMouseClickRecognizer = @"BTTFormMouseClickRecognizer"; 55 | NSString * const BTTFormTypeSeparator = @"BTTFormSeparator"; 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /BTTPluginSupport/BTTPluginFormItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // BTTPluginFormItem.h 3 | // BTTSamplePlugin 4 | // 5 | // Created by Andreas Hegenberg on 20.06.19. 6 | // 7 | 8 | #import 9 | #import "BTTFormConstants.h" 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface BTTPluginFormItem : NSObject 13 | @property (nonatomic, strong) NSString *formFieldID; 14 | @property (nonatomic, strong) NSString *formFieldID2; 15 | @property (nonatomic, strong) NSString *formFieldType; 16 | 17 | @property (nonatomic) BOOL doubleClickFocus; 18 | @property (nonatomic) BOOL doubleClickActivate; 19 | @property (nonatomic, strong) NSString *formIconName; 20 | @property (nonatomic) BOOL formIconIsTemplate; 21 | @property (nonatomic, strong) NSString *formLabel1; 22 | @property (nonatomic, strong) NSString *formLabel2; 23 | @property (nonatomic, strong) id formOption; 24 | @property (nonatomic, strong) NSData *formData; 25 | @property (nonatomic, strong) NSImage *formIcon; 26 | @property (nonatomic, strong) id defaultValue; 27 | @property (nonatomic) BOOL floats; 28 | @property (nonatomic) BOOL autoSave; 29 | @property (nonatomic) BOOL shouldTriggerReload; 30 | @property (nonatomic) BOOL saveLastStateToUserDefaults; 31 | @property (nonatomic) BTTFormData dataType; 32 | @property (nonatomic, strong) NSNumber *minValue; 33 | @property (nonatomic, strong) NSNumber *maxValue; 34 | @property (nonatomic, strong) NSArray *formOptions; 35 | @end 36 | 37 | NS_ASSUME_NONNULL_END 38 | -------------------------------------------------------------------------------- /BTTPluginSupport/BTTPluginFormItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // BTTPluginFormItem.m 3 | // BTTSamplePlugin 4 | // 5 | // Created by Andreas Hegenberg on 20.06.19. 6 | // 7 | 8 | #import "BTTPluginFormItem.h" 9 | 10 | @implementation BTTPluginFormItem 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /BTTPluginSupport/BTTPluginSupport.h: -------------------------------------------------------------------------------- 1 | // 2 | // BTTPluginSupport.h 3 | // BTTPluginSupport 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "BTTPluginFormItem.h" 11 | #import "BTTFormConstants.h" 12 | 13 | //! Project version number for BTTPluginSupport. 14 | FOUNDATION_EXPORT double BTTPluginSupportVersionNumber; 15 | 16 | //! Project version string for BTTPluginSupport. 17 | FOUNDATION_EXPORT const unsigned char BTTPluginSupportVersionString[]; 18 | 19 | // In this header, you should import all the public headers of your framework using statements like #import 20 | 21 | 22 | -------------------------------------------------------------------------------- /BTTPluginSupport/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2019 Andreas Hegenberg. All rights reserved. 23 | 24 | 25 | -------------------------------------------------------------------------------- /BTTStreamDeckPluginCPUUsage/BTTStreamDeckPluginCPUUsage-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 | 5 | #import "BTTPluginInterface.h" 6 | #import "BTTFormConstants.h" 7 | #import "BTTPluginFormItem.h" 8 | -------------------------------------------------------------------------------- /BTTStreamDeckPluginCPUUsage/CPUUsagePlugin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CPUUsagePlugin.swift 3 | // BTTStreamDeckPluginCPUUsage 4 | // 5 | // Created by Andreas Hegenberg on 07.07.22. 6 | // Copyright © 2022 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import AppKit 11 | 12 | @objc class CPUUsagePlugin : NSObject, BTTStreamDeckPluginInterface { 13 | let cpuUsageMonitor = MyCpuUsage() 14 | 15 | var displayString: String = "" 16 | // the delegate will be set automatically after this plugin is loaded in BTT 17 | var delegate : BTTStreamDeckPluginDelegate? 18 | 19 | override init() { 20 | super.init(); 21 | 22 | // monitor the cpu usage and update the widget accordingly 23 | cpuUsageMonitor.startMonitoring { currentCPULoad in 24 | self.displayString = String(format: "%.0f%%", currentCPULoad*100) 25 | 26 | // when this is called BTT will call the "widgetTitleStrings" function again 27 | self.delegate?.requestUpdate(self) 28 | 29 | } 30 | } 31 | 32 | 33 | // we just return a string with the current cpu usage 34 | // and make use of the default styling defined by the user 35 | func widgetTitleStrings() -> [String]? { 36 | return [displayString]; 37 | } 38 | 39 | func buttonIdentifiers() -> [String]? { 40 | return ["cpuUsage"]; 41 | } 42 | 43 | 44 | /* 45 | Alternatively these could be used: 46 | 47 | func widgetAttributedTitleStrings() -> [NSAttributedString]? { 48 | 49 | } 50 | 51 | func widgetImages() -> [NSImage]? { 52 | 53 | } 54 | 55 | func widgetDictionaries() -> [[AnyHashable : Any]]? { 56 | 57 | } 58 | */ 59 | 60 | 61 | func didReceiveNewConfigurationValues(_ configurationValues: [AnyHashable : Any]) { 62 | //let widgetName = configurationValues["plugin_var_widgetName"] 63 | //let checkboxValue = configurationValues["plugin_var_someCheckboxValue"] 64 | } 65 | 66 | 67 | // here you can configure what items are shown in the BTT configuration side-bar for this plugin 68 | class func configurationFormItems() -> BTTPluginFormItem? { 69 | 70 | let groupItem = BTTPluginFormItem.init(); 71 | groupItem.formFieldType = BTTFormTypeFormGroup; 72 | 73 | // add a bold title label 74 | let titleField = BTTPluginFormItem.init(); 75 | titleField.formFieldType = BTTFormTypeTitleField; 76 | titleField.formLabel1 = "CPU Load Example Widget (no further config available yet)"; 77 | 78 | groupItem.formOptions = [titleField /*, textField, checkbox*/]; 79 | 80 | return groupItem; 81 | } 82 | 83 | class func defaultConfiguration() -> [AnyHashable : Any] { 84 | return [ 85 | "BTTStreamDeckImageHeight" : 30, 86 | "BTTStreamDeckCornerRadius" : 12, 87 | "BTTStreamDeckBackgroundColor" : "255.000000, 96.000002, 94.000002, 255.000000", 88 | "BTTStreamDeckIconColor1" : "255.000000, 192.000000, 114.000000, 255.000000", 89 | "BTTStreamDeckAlternateImageHeight" : 50, 90 | "BTTStreamDeckMainTab" : 1, 91 | "BTTStreamDeckAlternateIconColor1" : "255, 255, 255, 255", 92 | "BTTStreamDeckIconColor2" : "255, 255, 255, 255", 93 | "BTTStreamDeckAlternateIconColor2" : "255, 255, 255, 255", 94 | "BTTStreamDeckAlternateIconColor3" : "255, 255, 255, 255", 95 | "BTTStreamDeckAlternateBackgroundColor" : "157.000006, 68.000004, 184.000004, 255.000000", 96 | "BTTStreamDeckAttributedTitle" : "cnRmZAAAAAADAAAAAgAAAAcAAABUWFQucnRmAQAAAC6EAQAAKwAAAAEAAAB8AQAAe1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcY29jb2FydGYyNjM4Clxjb2NvYXRleHRzY2FsaW5nMFxjb2NvYXBsYXRmb3JtMHtcZm9udHRibFxmMFxmbmlsXGZjaGFyc2V0MTI5IEJNSEFOTkFQcm9PVEY7fQp7XGNvbG9ydGJsO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTI1NTtccmVkMjU1XGdyZWVuMjU1XGJsdWUyNTU7fQp7XCpcZXhwYW5kZWRjb2xvcnRibDs7XGNzc3JnYlxjMTAwMDAwXGMxMDAwMDBcYzEwMDAwMDt9ClxwYXJkXHR4NTYwXHR4MTEyMFx0eDE2ODBcdHgyMjQwXHR4MjgwMFx0eDMzNjBcdHgzOTIwXHR4NDQ4MFx0eDUwNDBcdHg1NjAwXHR4NjE2MFx0eDY3MjBccGFyZGlybmF0dXJhbFxxY1xwYXJ0aWdodGVuZmFjdG9yMAoKXGYwXGJcZnM4OCBcY2YyIDk5JX0BAAAAIwAAAAEAAAAHAAAAVFhULnJ0ZhAAAADEfMlitgEAAAAAAAAAAAAA", 97 | "BTTStreamDeckAlternateCornerRadius" : 12, 98 | "BTTStreamDeckIconColor3" : "255, 255, 255, 255" 99 | 100 | ] 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /BTTStreamDeckPluginCPUUsage/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BTTPluginIcon 6 | icon 7 | BTTPluginIdentifier 8 | com.folivora.sd.cpuusage 9 | BTTPluginName 10 | A simple CPU usage widget 11 | BTTPluginType 12 | StreamDeck 13 | CFBundleDevelopmentRegion 14 | $(DEVELOPMENT_LANGUAGE) 15 | CFBundleExecutable 16 | $(EXECUTABLE_NAME) 17 | CFBundleIdentifier 18 | $(PRODUCT_BUNDLE_IDENTIFIER) 19 | CFBundleInfoDictionaryVersion 20 | 6.0 21 | CFBundleName 22 | $(PRODUCT_NAME) 23 | CFBundlePackageType 24 | BNDL 25 | CFBundleShortVersionString 26 | 1.0 27 | CFBundleVersion 28 | 1 29 | NSHumanReadableCopyright 30 | Copyright © 2022 Andreas Hegenberg. All rights reserved. 31 | NSPrincipalClass 32 | BTTStreamDeckPluginCPUUsage.CPUUsagePlugin 33 | 34 | 35 | -------------------------------------------------------------------------------- /BTTStreamDeckPluginCPUUsage/MyCpuUsage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MyCpuUsage.swift 3 | // BTTStreamDeckPluginCPUUsage 4 | 5 | 6 | import Foundation 7 | 8 | // Credit: https://stackoverflow.com/a/53901721/1068087 9 | // CPU usage credit VenoMKO: https://stackoverflow.com/a/6795612/1033581 10 | class MyCpuUsage { 11 | var cpuInfo: processor_info_array_t? 12 | var prevCpuInfo: processor_info_array_t? 13 | var numCpuInfo: mach_msg_type_number_t = 0 14 | var numPrevCpuInfo: mach_msg_type_number_t = 0 15 | var numCPUs: uint = 0 16 | var updateTimer: Timer? 17 | let CPUUsageLock: NSLock = NSLock() 18 | var cpuLoadBlock: ((CGFloat) -> Swift.Void)? 19 | 20 | init() { 21 | 22 | } 23 | 24 | func startMonitoring(_ loadBlock: @escaping ((CGFloat) -> Swift.Void)) { 25 | let mibKeys: [Int32] = [ CTL_HW, HW_NCPU ] 26 | // sysctl Swift usage credit Matt Gallagher: https://github.com/mattgallagher/CwlUtils/blob/master/Sources/CwlUtils/CwlSysctl.swift 27 | mibKeys.withUnsafeBufferPointer() { mib in 28 | var sizeOfNumCPUs: size_t = MemoryLayout.size 29 | let status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0) 30 | if status != 0 { 31 | numCPUs = 1 32 | } 33 | } 34 | updateTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(updateInfo), userInfo: nil, repeats: true) 35 | 36 | cpuLoadBlock = loadBlock 37 | } 38 | 39 | @objc func updateInfo(_ timer: Timer) { 40 | 41 | 42 | var numCPUsU: natural_t = 0 43 | let err: kern_return_t = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo); 44 | if err == KERN_SUCCESS { 45 | CPUUsageLock.lock() 46 | guard let cpuInfo = cpuInfo else { 47 | return 48 | } 49 | 50 | var totalInUse: Float = 0 51 | for i in 0 ..< Int32(numCPUs) { 52 | var inUse: Int32 53 | var total: Int32 54 | if let prevCpuInfo = prevCpuInfo { 55 | inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)] 56 | - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)] 57 | + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)] 58 | - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)] 59 | + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)] 60 | - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)] 61 | total = inUse + (cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)] 62 | - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]) 63 | } else { 64 | inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)] 65 | + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)] 66 | + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)] 67 | total = inUse + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)] 68 | } 69 | 70 | // print(String(format: "Core: %u Usage: %f", i, Float(inUse) / Float(total))) 71 | totalInUse = totalInUse + (Float(inUse) / Float(total)) 72 | } 73 | 74 | //print(String(format: "Total %f", totalInUse / Float(numCPUs))) 75 | 76 | CPUUsageLock.unlock() 77 | cpuLoadBlock?(CGFloat(totalInUse / Float(numCPUs))) 78 | if let prevCpuInfo = prevCpuInfo { 79 | // vm_deallocate Swift usage credit rsfinn: https://stackoverflow.com/a/48630296/1033581 80 | let prevCpuInfoSize: size_t = MemoryLayout.stride * Int(numPrevCpuInfo) 81 | vm_deallocate(mach_task_self_, vm_address_t(bitPattern: prevCpuInfo), vm_size_t(prevCpuInfoSize)) 82 | } 83 | 84 | prevCpuInfo = cpuInfo 85 | numPrevCpuInfo = numCpuInfo 86 | numCpuInfo = 0 87 | } else { 88 | print("Error!") 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /BTTStreamDeckPluginCPUUsage/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTStreamDeckPluginCPUUsage/icon.png -------------------------------------------------------------------------------- /BTTStreamDeckPluginCPUUsage/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTStreamDeckPluginCPUUsage/icon@2x.png -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomString/BTTTouchBarPluginSampleCustomString-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 | 5 | #import "BTTPluginInterface.h" 6 | #import "BTTFormConstants.h" 7 | #import "BTTPluginFormItem.h" 8 | -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomString/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | NSHumanReadableCopyright 22 | Copyright © 2019 Andreas Hegenberg. All rights reserved. 23 | NSPrincipalClass 24 | BTTTouchBarPluginSampleCustomString.SamplePluginCustomString 25 | BTTPluginIcon 26 | icon 27 | BTTPluginName 28 | Custom String Plugin 29 | BTTPluginIdentifier 30 | com.something.customstringplugin 31 | 32 | 33 | -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomString/SamplePluginCustomString.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import AppKit 3 | @objc class SamplePluginCustomString : NSObject, BTTPluginInterface 4 | { 5 | // the delegate will be set automatically after this plugin is loaded in BTT 6 | var delegate : BTTTouchBarPluginDelegate? 7 | 8 | 9 | var configurationValues: Dictionary = [:]; 10 | 11 | 12 | override init() { 13 | super.init(); 14 | DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 15 | self.updateStringRegularly(); 16 | } 17 | } 18 | 19 | 20 | /* MARK: Option 3: Returning a NSViewController instance 21 | * if you return a view controller BTT will display the view 22 | * controller's view on 23 | * the Touch Bar. 24 | * You are responsible for any styling you want to apply. 25 | * Make sure to always return the same instance of the button 26 | * here. 27 | */ 28 | func touchBarTitleString() -> String? { 29 | return "Hello Custom String!"; 30 | } 31 | 32 | func updateStringRegularly() { 33 | let date = NSDate(); 34 | let calendar = NSCalendar.current; 35 | let component = calendar.component(.second, from: date as Date); 36 | 37 | let newString = "Hello Custom String! \(component)"; 38 | self.delegate?.update(with: newString, sender: self); 39 | 40 | // every second 41 | DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 42 | self.updateStringRegularly(); 43 | } 44 | } 45 | 46 | // here you can configure what items are shown in the BTT configuration side-bar for this plugin 47 | class func configurationFormItems() -> BTTPluginFormItem? { 48 | 49 | // here we just create a text field, we will receive the 50 | // current value in didReceiveNewConfigurationValues 51 | let item = BTTPluginFormItem.init(); 52 | item.formFieldType = BTTFormTypeTextField; 53 | item.formLabel1 = "Custom Widget Name"; 54 | // the id must stat with plugin_var_ (will be added automatically if necessary) 55 | item.formFieldID = "plugin_var_widgetName"; 56 | return item; 57 | } 58 | 59 | func didReceiveNewConfigurationValues(_ configurationValues: [AnyHashable : Any]) { 60 | self.configurationValues = configurationValues; 61 | } 62 | 63 | // this will tell BTT to execute the actions the user assigned to this widget 64 | @objc func executeAssignedBTTActions() { 65 | self.delegate?.executeAssignedBTTActions(self); 66 | } 67 | 68 | } 69 | 70 | -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomString/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTTouchBarPluginSampleCustomString/icon.png -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomString/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTTouchBarPluginSampleCustomString/icon@2x.png -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomView/BTTTouchBarPluginSampleCustomView-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 | 5 | #import "BTTPluginInterface.h" 6 | #import "BTTFormConstants.h" 7 | #import "BTTPluginFormItem.h" 8 | -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomView/CustomViewVC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomViewVC.swift 3 | // BTTTouchBarPluginSampleCustomView 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class CustomViewVC: NSViewController { 12 | 13 | override func loadView() { 14 | self.view = NSView.init(frame: NSMakeRect(0, 0, 40, 30)); 15 | } 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | // Do view setup here. 20 | 21 | //create a red dot, you can do whatever you want to do here 22 | self.view.wantsLayer = true; 23 | self.view.layer?.backgroundColor = NSColor.red.cgColor; 24 | self.view.layer?.cornerRadius = 10; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | NSHumanReadableCopyright 22 | Copyright © 2019 Andreas Hegenberg. All rights reserved. 23 | NSPrincipalClass 24 | BTTTouchBarPluginSampleCustomView.SamplePluginCustomView 25 | BTTPluginIcon 26 | icon 27 | BTTPluginName 28 | Custom View Plugin 29 | BTTPluginIdentifier 30 | com.something.customviewplugin 31 | 32 | 33 | -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomView/SamplePluginCustomView.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import AppKit 3 | @objc class SamplePluginCustomView : NSObject, BTTPluginInterface 4 | { 5 | // the delegate will be set automatically after this plugin is loaded in BTT 6 | var delegate : BTTTouchBarPluginDelegate? 7 | 8 | 9 | var customVC: CustomViewVC?; 10 | var configurationValues: Dictionary = [:]; 11 | 12 | 13 | /* MARK: Option 3: Returning a NSViewController instance 14 | * if you return a view controller BTT will display the view 15 | * controller's view on 16 | * the Touch Bar. 17 | * You are responsible for any styling you want to apply. 18 | * Make sure to always return the same instance of the button 19 | * here. 20 | */ 21 | func touchBarViewController() -> NSViewController? { 22 | if(self.customVC == nil) { 23 | self.customVC = CustomViewVC.init(); 24 | self.configure(); 25 | 26 | } 27 | return self.customVC; 28 | } 29 | 30 | 31 | func configure() { 32 | if((self.configurationValues["plugin_var_widgetName"]) != nil) { 33 | // do something to the view 34 | } 35 | } 36 | 37 | // here you can configure what items are shown in the BTT configuration side-bar for this plugin 38 | class func configurationFormItems() -> BTTPluginFormItem? { 39 | 40 | // here we just create a text field, we will receive the 41 | // current value in didReceiveNewConfigurationValues 42 | let item = BTTPluginFormItem.init(); 43 | item.formFieldType = BTTFormTypeTextField; 44 | item.formLabel1 = "Custom Widget Name"; 45 | 46 | // the id must stat with plugin_var_ (will be added automatically if necessary) 47 | item.formFieldID = "plugin_var_widgetName"; 48 | 49 | return item; 50 | } 51 | 52 | func didReceiveNewConfigurationValues(_ configurationValues: [AnyHashable : Any]) { 53 | self.configurationValues = configurationValues; 54 | if (self.customVC != nil) { 55 | self.configure(); 56 | } 57 | } 58 | 59 | // this will tell BTT to execute the actions the user assigned to this widget 60 | @objc func executeAssignedBTTActions() { 61 | self.delegate?.executeAssignedBTTActions(self); 62 | } 63 | 64 | } 65 | 66 | -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomView/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTTouchBarPluginSampleCustomView/icon.png -------------------------------------------------------------------------------- /BTTTouchBarPluginSampleCustomView/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTTouchBarPluginSampleCustomView/icon@2x.png -------------------------------------------------------------------------------- /BTTTouchBarSampleCustomButton/BTTTouchBarSampleCustomButton-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 | 5 | #import "BTTPluginInterface.h" 6 | #import "BTTFormConstants.h" 7 | #import "BTTPluginFormItem.h" 8 | -------------------------------------------------------------------------------- /BTTTouchBarSampleCustomButton/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | NSHumanReadableCopyright 22 | Copyright © 2019 Andreas Hegenberg. All rights reserved. 23 | NSPrincipalClass 24 | BTTTouchBarSampleCustomButton.SamplePluginCustomButton 25 | BTTPluginName 26 | Custom Button Plugin 27 | BTTPluginIdentifier 28 | com.something.custombuttonplugin 29 | BTTPluginIcon 30 | icon 31 | 32 | 33 | -------------------------------------------------------------------------------- /BTTTouchBarSampleCustomButton/SamplePluginCustomButton.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import AppKit 3 | @objc class SamplePluginCustomButton : NSObject, BTTPluginInterface 4 | { 5 | // the delegate will be set automatically after this plugin is loaded in BTT 6 | var delegate : BTTTouchBarPluginDelegate? 7 | 8 | 9 | var button: NSButton?; 10 | var configurationValues: Dictionary = [:]; 11 | 12 | 13 | /* MARK: Option 2: Returning a NSButton instance 14 | * If you return a button, BTT will just display that button on the Touch Bar. 15 | * You are responsible for any styling you want to apply. 16 | * Make sure to always return the same instance of the button here 17 | * as BTT may call this method multiple times. 18 | */ 19 | func touchBarButton() -> NSButton? { 20 | if(self.button == nil) { 21 | self.button = NSButton.init(title: "Hello Custom Button!", target: self, action: #selector(executeAssignedBTTActions)); 22 | self.configureButton(); 23 | 24 | } 25 | return self.button; 26 | } 27 | 28 | func configureButton() { 29 | self.button?.bezelColor = NSColor.blue; 30 | 31 | if((self.configurationValues["plugin_var_widgetName"]) != nil) { 32 | self.button?.title = configurationValues["plugin_var_widgetName"] as! String; 33 | 34 | //MARK: Important: you need to make sure the button/view has the correct frame. 35 | self.button?.sizeToFit(); 36 | } 37 | } 38 | 39 | // here you can configure what items are shown in the BTT configuration side-bar for this plugin 40 | class func configurationFormItems() -> BTTPluginFormItem? { 41 | 42 | let groupItem = BTTPluginFormItem.init(); 43 | groupItem.formFieldType = BTTFormTypeFormGroup; 44 | 45 | // add a bold title label 46 | let titleField = BTTPluginFormItem.init(); 47 | titleField.formFieldType = BTTFormTypeTitleField; 48 | titleField.formLabel1 = "Some Example Title"; 49 | 50 | // here we create a text field, we will receive the 51 | // current value in didReceiveNewConfigurationValues 52 | let textField = BTTPluginFormItem.init(); 53 | textField.formFieldType = BTTFormTypeTextField; 54 | textField.formLabel1 = "Custom Widget Name"; 55 | // the id must stat with plugin_var_ (will be added automatically if necessary) 56 | textField.formFieldID = "plugin_var_widgetName"; 57 | 58 | // here we create a checkbox, we will receive the 59 | // current value in didReceiveNewConfigurationValues 60 | let checkbox = BTTPluginFormItem.init(); 61 | checkbox.formFieldType = BTTFormTypeCheckbox; 62 | checkbox.formLabel1 = "Some Checkbox"; 63 | // the id must stat with plugin_var_ (will be added automatically if necessary) 64 | checkbox.formFieldID = "plugin_var_someCheckboxValue"; 65 | 66 | 67 | groupItem.formOptions = [titleField, textField, checkbox]; 68 | 69 | return groupItem; 70 | } 71 | 72 | func didReceiveNewConfigurationValues(_ configurationValues: [AnyHashable : Any]) { 73 | self.configurationValues = configurationValues; 74 | if (self.button != nil) { 75 | self.configureButton(); 76 | } 77 | } 78 | 79 | // this will tell BTT to execute the actions the user assigned to this widget 80 | @objc func executeAssignedBTTActions() { 81 | self.delegate?.executeAssignedBTTActions(self); 82 | } 83 | 84 | } 85 | 86 | -------------------------------------------------------------------------------- /BTTTouchBarSampleCustomButton/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTTouchBarSampleCustomButton/icon.png -------------------------------------------------------------------------------- /BTTTouchBarSampleCustomButton/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BTTTouchBarSampleCustomButton/icon@2x.png -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A9454BC322BE1E3300055860 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9454BC222BE1E3300055860 /* AppDelegate.m */; }; 11 | A9454BC622BE1E3300055860 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9454BC522BE1E3300055860 /* ViewController.m */; }; 12 | A9454BC822BE1E3500055860 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A9454BC722BE1E3500055860 /* Assets.xcassets */; }; 13 | A9454BCB22BE1E3500055860 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A9454BC922BE1E3500055860 /* Main.storyboard */; }; 14 | A9454BCE22BE1E3500055860 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A9454BCD22BE1E3500055860 /* main.m */; }; 15 | A9454C1222BE1F7700055860 /* SamplePluginCustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9454C1122BE1F7700055860 /* SamplePluginCustomButton.swift */; }; 16 | A9454C1522BE1F9100055860 /* SamplePluginCustomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9454C1422BE1F9100055860 /* SamplePluginCustomView.swift */; }; 17 | A9454C1822BE1FA300055860 /* SamplePluginCustomString.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9454C1722BE1FA300055860 /* SamplePluginCustomString.swift */; }; 18 | A9454C3522BE219400055860 /* CustomViewVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9454C3422BE219400055860 /* CustomViewVC.swift */; }; 19 | A9454C3822BE224500055860 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9454C3622BE224500055860 /* icon.png */; }; 20 | A9454C3922BE224500055860 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9454C3722BE224500055860 /* icon@2x.png */; }; 21 | A9454C3C22BE24D700055860 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9454C3A22BE24D700055860 /* icon.png */; }; 22 | A9454C3D22BE24D700055860 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9454C3B22BE24D700055860 /* icon@2x.png */; }; 23 | A9454C4022BE24E200055860 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9454C3E22BE24E200055860 /* icon@2x.png */; }; 24 | A9454C4122BE24E200055860 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9454C3F22BE24E200055860 /* icon.png */; }; 25 | A9454C4422BE324900055860 /* DemoTouchBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9454C4322BE324900055860 /* DemoTouchBarViewController.m */; }; 26 | A9454C5C22BE69BA00055860 /* BTTPluginSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A9454C4C22BE69BA00055860 /* BTTPluginSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27 | A9454C5F22BE69BA00055860 /* BTTPluginSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; }; 28 | A9454C6022BE69BA00055860 /* BTTPluginSupport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 29 | A9454C6822BE69C700055860 /* BTTFormConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = A9454C2822BE204300055860 /* BTTFormConstants.m */; }; 30 | A9454C6922BE69C700055860 /* BTTPluginFormItem.m in Sources */ = {isa = PBXBuildFile; fileRef = A9454C2722BE204300055860 /* BTTPluginFormItem.m */; }; 31 | A9454C7122BE6A2200055860 /* BTTPluginSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; }; 32 | A9454C7222BE6A2600055860 /* BTTPluginSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; }; 33 | A9454C7322BE6A3400055860 /* BTTPluginSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; }; 34 | A9454C7622BE6B4F00055860 /* WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9454C7522BE6B4F00055860 /* WindowController.m */; }; 35 | A9D31E5E287823450073D6A4 /* MyCpuUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D31E5D287823450073D6A4 /* MyCpuUsage.swift */; }; 36 | A9DC034D23D4AF5600C0E704 /* ShowNotificationPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9DC034C23D4AF5600C0E704 /* ShowNotificationPlugin.swift */; }; 37 | A9DC035023D4B3A100C0E704 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9DC034E23D4B3A100C0E704 /* icon.png */; }; 38 | A9DC035123D4B3A100C0E704 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9DC034F23D4B3A100C0E704 /* icon@2x.png */; }; 39 | A9DC035223D4B59200C0E704 /* BTTPluginSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; }; 40 | A9DC035323D4B59200C0E704 /* BTTPluginSupport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 41 | A9ED79FA2877753800B95821 /* BTTPluginSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; }; 42 | A9ED7A052877762F00B95821 /* CPUUsagePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9ED7A042877762F00B95821 /* CPUUsagePlugin.swift */; }; 43 | A9ED7A082877767300B95821 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A9ED7A062877767300B95821 /* icon.png */; }; 44 | A9ED7A092877767300B95821 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A9ED7A072877767300B95821 /* icon@2x.png */; }; 45 | /* End PBXBuildFile section */ 46 | 47 | /* Begin PBXContainerItemProxy section */ 48 | A9454C1922BE1FEA00055860 /* PBXContainerItemProxy */ = { 49 | isa = PBXContainerItemProxy; 50 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 51 | proxyType = 1; 52 | remoteGlobalIDString = A9454BF422BE1E7D00055860; 53 | remoteInfo = BTTTouchBarSampleCustomButton; 54 | }; 55 | A9454C1B22BE1FED00055860 /* PBXContainerItemProxy */ = { 56 | isa = PBXContainerItemProxy; 57 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 58 | proxyType = 1; 59 | remoteGlobalIDString = A9454BFE22BE1E9900055860; 60 | remoteInfo = BTTTouchBarPluginSampleCustomView; 61 | }; 62 | A9454C1D22BE1FF000055860 /* PBXContainerItemProxy */ = { 63 | isa = PBXContainerItemProxy; 64 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 65 | proxyType = 1; 66 | remoteGlobalIDString = A9454C0822BE1EC600055860; 67 | remoteInfo = BTTTouchBarPluginSampleCustomString; 68 | }; 69 | A9454C5D22BE69BA00055860 /* PBXContainerItemProxy */ = { 70 | isa = PBXContainerItemProxy; 71 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 72 | proxyType = 1; 73 | remoteGlobalIDString = A9454C4922BE69BA00055860; 74 | remoteInfo = BTTPluginSupport; 75 | }; 76 | A9454C6A22BE6A0600055860 /* PBXContainerItemProxy */ = { 77 | isa = PBXContainerItemProxy; 78 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 79 | proxyType = 1; 80 | remoteGlobalIDString = A9454C4922BE69BA00055860; 81 | remoteInfo = BTTPluginSupport; 82 | }; 83 | A9454C6C22BE6A0D00055860 /* PBXContainerItemProxy */ = { 84 | isa = PBXContainerItemProxy; 85 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 86 | proxyType = 1; 87 | remoteGlobalIDString = A9454C4922BE69BA00055860; 88 | remoteInfo = BTTPluginSupport; 89 | }; 90 | A9454C6E22BE6A1300055860 /* PBXContainerItemProxy */ = { 91 | isa = PBXContainerItemProxy; 92 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 93 | proxyType = 1; 94 | remoteGlobalIDString = A9454C4922BE69BA00055860; 95 | remoteInfo = BTTPluginSupport; 96 | }; 97 | A9C1C5C8287A273E00A78C42 /* PBXContainerItemProxy */ = { 98 | isa = PBXContainerItemProxy; 99 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 100 | proxyType = 1; 101 | remoteGlobalIDString = A9ED79F42877753800B95821; 102 | remoteInfo = BTTStreamDeckPluginCPUUsage; 103 | }; 104 | A9C1C5CA287A27A500A78C42 /* PBXContainerItemProxy */ = { 105 | isa = PBXContainerItemProxy; 106 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 107 | proxyType = 1; 108 | remoteGlobalIDString = A9DC034423D4AEB900C0E704; 109 | remoteInfo = BTTDisplayNotificationActionPlugin; 110 | }; 111 | A9DC035423D4B59200C0E704 /* PBXContainerItemProxy */ = { 112 | isa = PBXContainerItemProxy; 113 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 114 | proxyType = 1; 115 | remoteGlobalIDString = A9454C4922BE69BA00055860; 116 | remoteInfo = BTTPluginSupport; 117 | }; 118 | A9ED79F62877753800B95821 /* PBXContainerItemProxy */ = { 119 | isa = PBXContainerItemProxy; 120 | containerPortal = A9454BB622BE1E3300055860 /* Project object */; 121 | proxyType = 1; 122 | remoteGlobalIDString = A9454C4922BE69BA00055860; 123 | remoteInfo = BTTPluginSupport; 124 | }; 125 | /* End PBXContainerItemProxy section */ 126 | 127 | /* Begin PBXCopyFilesBuildPhase section */ 128 | A9454C6422BE69BA00055860 /* Embed Frameworks */ = { 129 | isa = PBXCopyFilesBuildPhase; 130 | buildActionMask = 2147483647; 131 | dstPath = ""; 132 | dstSubfolderSpec = 10; 133 | files = ( 134 | A9454C6022BE69BA00055860 /* BTTPluginSupport.framework in Embed Frameworks */, 135 | ); 136 | name = "Embed Frameworks"; 137 | runOnlyForDeploymentPostprocessing = 0; 138 | }; 139 | A9DC035623D4B59200C0E704 /* Embed Frameworks */ = { 140 | isa = PBXCopyFilesBuildPhase; 141 | buildActionMask = 2147483647; 142 | dstPath = ""; 143 | dstSubfolderSpec = 10; 144 | files = ( 145 | A9DC035323D4B59200C0E704 /* BTTPluginSupport.framework in Embed Frameworks */, 146 | ); 147 | name = "Embed Frameworks"; 148 | runOnlyForDeploymentPostprocessing = 0; 149 | }; 150 | /* End PBXCopyFilesBuildPhase section */ 151 | 152 | /* Begin PBXFileReference section */ 153 | A9454BBE22BE1E3300055860 /* BetterTouchToolPluginDevelopment.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BetterTouchToolPluginDevelopment.app; sourceTree = BUILT_PRODUCTS_DIR; }; 154 | A9454BC122BE1E3300055860 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 155 | A9454BC222BE1E3300055860 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 156 | A9454BC422BE1E3300055860 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 157 | A9454BC522BE1E3300055860 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 158 | A9454BC722BE1E3500055860 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 159 | A9454BCA22BE1E3500055860 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 160 | A9454BCC22BE1E3500055860 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 161 | A9454BCD22BE1E3500055860 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 162 | A9454BCF22BE1E3500055860 /* BetterTouchToolPluginDevelopment.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BetterTouchToolPluginDevelopment.entitlements; sourceTree = ""; }; 163 | A9454BF522BE1E7D00055860 /* BTTTouchBarSampleCustomButton.btttouchbarplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BTTTouchBarSampleCustomButton.btttouchbarplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 164 | A9454BF722BE1E7D00055860 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 165 | A9454BFF22BE1E9900055860 /* BTTTouchBarPluginSampleCustomView.btttouchbarplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BTTTouchBarPluginSampleCustomView.btttouchbarplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 166 | A9454C0122BE1E9900055860 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 167 | A9454C0922BE1EC600055860 /* BTTTouchBarPluginSampleCustomString.btttouchbarplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BTTTouchBarPluginSampleCustomString.btttouchbarplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 168 | A9454C0B22BE1EC600055860 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 169 | A9454C0F22BE1F5B00055860 /* BTTPluginInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BTTPluginInterface.h; sourceTree = ""; }; 170 | A9454C1022BE1F7700055860 /* BTTTouchBarSampleCustomButton-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BTTTouchBarSampleCustomButton-Bridging-Header.h"; sourceTree = ""; }; 171 | A9454C1122BE1F7700055860 /* SamplePluginCustomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SamplePluginCustomButton.swift; sourceTree = ""; }; 172 | A9454C1322BE1F9100055860 /* BTTTouchBarPluginSampleCustomView-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BTTTouchBarPluginSampleCustomView-Bridging-Header.h"; sourceTree = ""; }; 173 | A9454C1422BE1F9100055860 /* SamplePluginCustomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SamplePluginCustomView.swift; sourceTree = ""; }; 174 | A9454C1622BE1FA300055860 /* BTTTouchBarPluginSampleCustomString-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BTTTouchBarPluginSampleCustomString-Bridging-Header.h"; sourceTree = ""; }; 175 | A9454C1722BE1FA300055860 /* SamplePluginCustomString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SamplePluginCustomString.swift; sourceTree = ""; }; 176 | A9454C2722BE204300055860 /* BTTPluginFormItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BTTPluginFormItem.m; sourceTree = ""; }; 177 | A9454C2822BE204300055860 /* BTTFormConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BTTFormConstants.m; sourceTree = ""; }; 178 | A9454C2922BE204300055860 /* BTTPluginFormItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BTTPluginFormItem.h; sourceTree = ""; }; 179 | A9454C2A22BE204300055860 /* BTTFormConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BTTFormConstants.h; sourceTree = ""; }; 180 | A9454C3422BE219400055860 /* CustomViewVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomViewVC.swift; sourceTree = ""; }; 181 | A9454C3622BE224500055860 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; 182 | A9454C3722BE224500055860 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon@2x.png"; sourceTree = ""; }; 183 | A9454C3A22BE24D700055860 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; 184 | A9454C3B22BE24D700055860 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon@2x.png"; sourceTree = ""; }; 185 | A9454C3E22BE24E200055860 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon@2x.png"; sourceTree = ""; }; 186 | A9454C3F22BE24E200055860 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; 187 | A9454C4222BE324900055860 /* DemoTouchBarViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoTouchBarViewController.h; sourceTree = ""; }; 188 | A9454C4322BE324900055860 /* DemoTouchBarViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoTouchBarViewController.m; sourceTree = ""; }; 189 | A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BTTPluginSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 190 | A9454C4C22BE69BA00055860 /* BTTPluginSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BTTPluginSupport.h; sourceTree = ""; }; 191 | A9454C4D22BE69BA00055860 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 192 | A9454C7422BE6B4F00055860 /* WindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WindowController.h; sourceTree = ""; }; 193 | A9454C7522BE6B4F00055860 /* WindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WindowController.m; sourceTree = ""; }; 194 | A9D31E5D287823450073D6A4 /* MyCpuUsage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCpuUsage.swift; sourceTree = ""; }; 195 | A9DC034523D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin.bttactionplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BTTDisplayNotificationActionPlugin.bttactionplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 196 | A9DC034723D4AEB900C0E704 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 197 | A9DC034B23D4AF5500C0E704 /* BTTDisplayNotificationActionPlugin-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BTTDisplayNotificationActionPlugin-Bridging-Header.h"; sourceTree = ""; }; 198 | A9DC034C23D4AF5600C0E704 /* ShowNotificationPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowNotificationPlugin.swift; sourceTree = ""; }; 199 | A9DC034E23D4B3A100C0E704 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; 200 | A9DC034F23D4B3A100C0E704 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon@2x.png"; sourceTree = ""; }; 201 | A9ED7A012877753800B95821 /* BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 202 | A9ED7A022877753800B95821 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = /Users/andi/Xcode/BetterTouchTool/BetterTouchToolPlugins/BTTStreamDeckPluginCPUUsage/Info.plist; sourceTree = ""; }; 203 | A9ED7A042877762F00B95821 /* CPUUsagePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPUUsagePlugin.swift; sourceTree = ""; }; 204 | A9ED7A062877767300B95821 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon.png; sourceTree = ""; }; 205 | A9ED7A072877767300B95821 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon@2x.png"; sourceTree = ""; }; 206 | A9ED7A0A287776E100B95821 /* BTTStreamDeckPluginCPUUsage-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BTTStreamDeckPluginCPUUsage-Bridging-Header.h"; sourceTree = ""; }; 207 | /* End PBXFileReference section */ 208 | 209 | /* Begin PBXFrameworksBuildPhase section */ 210 | A9454BBB22BE1E3300055860 /* Frameworks */ = { 211 | isa = PBXFrameworksBuildPhase; 212 | buildActionMask = 2147483647; 213 | files = ( 214 | A9454C5F22BE69BA00055860 /* BTTPluginSupport.framework in Frameworks */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | A9454BF222BE1E7D00055860 /* Frameworks */ = { 219 | isa = PBXFrameworksBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | A9454C7122BE6A2200055860 /* BTTPluginSupport.framework in Frameworks */, 223 | ); 224 | runOnlyForDeploymentPostprocessing = 0; 225 | }; 226 | A9454BFC22BE1E9900055860 /* Frameworks */ = { 227 | isa = PBXFrameworksBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | A9454C7222BE6A2600055860 /* BTTPluginSupport.framework in Frameworks */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | A9454C0622BE1EC600055860 /* Frameworks */ = { 235 | isa = PBXFrameworksBuildPhase; 236 | buildActionMask = 2147483647; 237 | files = ( 238 | A9454C7322BE6A3400055860 /* BTTPluginSupport.framework in Frameworks */, 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | A9454C4722BE69BA00055860 /* Frameworks */ = { 243 | isa = PBXFrameworksBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | }; 249 | A9DC034223D4AEB900C0E704 /* Frameworks */ = { 250 | isa = PBXFrameworksBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | A9DC035223D4B59200C0E704 /* BTTPluginSupport.framework in Frameworks */, 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | A9ED79F92877753800B95821 /* Frameworks */ = { 258 | isa = PBXFrameworksBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | A9ED79FA2877753800B95821 /* BTTPluginSupport.framework in Frameworks */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | /* End PBXFrameworksBuildPhase section */ 266 | 267 | /* Begin PBXGroup section */ 268 | A9454BB522BE1E3300055860 = { 269 | isa = PBXGroup; 270 | children = ( 271 | A9454BC022BE1E3300055860 /* BetterTouchToolPluginDevelopment */, 272 | A9ED7A032877759700B95821 /* BTTStreamDeckPluginCPUUsage */, 273 | A9454BF622BE1E7D00055860 /* BTTTouchBarSampleCustomButton */, 274 | A9454C0022BE1E9900055860 /* BTTTouchBarPluginSampleCustomView */, 275 | A9454C0A22BE1EC600055860 /* BTTTouchBarPluginSampleCustomString */, 276 | A9DC034623D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin */, 277 | A9454C4B22BE69BA00055860 /* BTTPluginSupport */, 278 | A9454BBF22BE1E3300055860 /* Products */, 279 | A9454C7022BE6A2200055860 /* Frameworks */, 280 | ); 281 | sourceTree = ""; 282 | }; 283 | A9454BBF22BE1E3300055860 /* Products */ = { 284 | isa = PBXGroup; 285 | children = ( 286 | A9454BBE22BE1E3300055860 /* BetterTouchToolPluginDevelopment.app */, 287 | A9454BF522BE1E7D00055860 /* BTTTouchBarSampleCustomButton.btttouchbarplugin */, 288 | A9454BFF22BE1E9900055860 /* BTTTouchBarPluginSampleCustomView.btttouchbarplugin */, 289 | A9454C0922BE1EC600055860 /* BTTTouchBarPluginSampleCustomString.btttouchbarplugin */, 290 | A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */, 291 | A9DC034523D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin.bttactionplugin */, 292 | A9ED7A012877753800B95821 /* BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin */, 293 | ); 294 | name = Products; 295 | sourceTree = ""; 296 | }; 297 | A9454BC022BE1E3300055860 /* BetterTouchToolPluginDevelopment */ = { 298 | isa = PBXGroup; 299 | children = ( 300 | A9454C0F22BE1F5B00055860 /* BTTPluginInterface.h */, 301 | A9454BC122BE1E3300055860 /* AppDelegate.h */, 302 | A9454BC222BE1E3300055860 /* AppDelegate.m */, 303 | A9454BC422BE1E3300055860 /* ViewController.h */, 304 | A9454BC522BE1E3300055860 /* ViewController.m */, 305 | A9454C7422BE6B4F00055860 /* WindowController.h */, 306 | A9454C7522BE6B4F00055860 /* WindowController.m */, 307 | A9454C4222BE324900055860 /* DemoTouchBarViewController.h */, 308 | A9454C4322BE324900055860 /* DemoTouchBarViewController.m */, 309 | A9454BC722BE1E3500055860 /* Assets.xcassets */, 310 | A9454BC922BE1E3500055860 /* Main.storyboard */, 311 | A9454BCC22BE1E3500055860 /* Info.plist */, 312 | A9454BCD22BE1E3500055860 /* main.m */, 313 | A9454BCF22BE1E3500055860 /* BetterTouchToolPluginDevelopment.entitlements */, 314 | ); 315 | path = BetterTouchToolPluginDevelopment; 316 | sourceTree = ""; 317 | }; 318 | A9454BF622BE1E7D00055860 /* BTTTouchBarSampleCustomButton */ = { 319 | isa = PBXGroup; 320 | children = ( 321 | A9454C3622BE224500055860 /* icon.png */, 322 | A9454C3722BE224500055860 /* icon@2x.png */, 323 | A9454BF722BE1E7D00055860 /* Info.plist */, 324 | A9454C1122BE1F7700055860 /* SamplePluginCustomButton.swift */, 325 | A9454C1022BE1F7700055860 /* BTTTouchBarSampleCustomButton-Bridging-Header.h */, 326 | ); 327 | path = BTTTouchBarSampleCustomButton; 328 | sourceTree = ""; 329 | }; 330 | A9454C0022BE1E9900055860 /* BTTTouchBarPluginSampleCustomView */ = { 331 | isa = PBXGroup; 332 | children = ( 333 | A9454C3A22BE24D700055860 /* icon.png */, 334 | A9454C3B22BE24D700055860 /* icon@2x.png */, 335 | A9454C0122BE1E9900055860 /* Info.plist */, 336 | A9454C1422BE1F9100055860 /* SamplePluginCustomView.swift */, 337 | A9454C3422BE219400055860 /* CustomViewVC.swift */, 338 | A9454C1322BE1F9100055860 /* BTTTouchBarPluginSampleCustomView-Bridging-Header.h */, 339 | ); 340 | path = BTTTouchBarPluginSampleCustomView; 341 | sourceTree = ""; 342 | }; 343 | A9454C0A22BE1EC600055860 /* BTTTouchBarPluginSampleCustomString */ = { 344 | isa = PBXGroup; 345 | children = ( 346 | A9454C3F22BE24E200055860 /* icon.png */, 347 | A9454C3E22BE24E200055860 /* icon@2x.png */, 348 | A9454C0B22BE1EC600055860 /* Info.plist */, 349 | A9454C1722BE1FA300055860 /* SamplePluginCustomString.swift */, 350 | A9454C1622BE1FA300055860 /* BTTTouchBarPluginSampleCustomString-Bridging-Header.h */, 351 | ); 352 | path = BTTTouchBarPluginSampleCustomString; 353 | sourceTree = ""; 354 | }; 355 | A9454C4B22BE69BA00055860 /* BTTPluginSupport */ = { 356 | isa = PBXGroup; 357 | children = ( 358 | A9454C2922BE204300055860 /* BTTPluginFormItem.h */, 359 | A9454C2722BE204300055860 /* BTTPluginFormItem.m */, 360 | A9454C2822BE204300055860 /* BTTFormConstants.m */, 361 | A9454C2A22BE204300055860 /* BTTFormConstants.h */, 362 | A9454C4C22BE69BA00055860 /* BTTPluginSupport.h */, 363 | A9454C4D22BE69BA00055860 /* Info.plist */, 364 | ); 365 | path = BTTPluginSupport; 366 | sourceTree = ""; 367 | }; 368 | A9454C7022BE6A2200055860 /* Frameworks */ = { 369 | isa = PBXGroup; 370 | children = ( 371 | ); 372 | name = Frameworks; 373 | sourceTree = ""; 374 | }; 375 | A9DC034623D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin */ = { 376 | isa = PBXGroup; 377 | children = ( 378 | A9DC034723D4AEB900C0E704 /* Info.plist */, 379 | A9DC034C23D4AF5600C0E704 /* ShowNotificationPlugin.swift */, 380 | A9DC034E23D4B3A100C0E704 /* icon.png */, 381 | A9DC034F23D4B3A100C0E704 /* icon@2x.png */, 382 | A9DC034B23D4AF5500C0E704 /* BTTDisplayNotificationActionPlugin-Bridging-Header.h */, 383 | ); 384 | path = BTTDisplayNotificationActionPlugin; 385 | sourceTree = ""; 386 | }; 387 | A9ED7A032877759700B95821 /* BTTStreamDeckPluginCPUUsage */ = { 388 | isa = PBXGroup; 389 | children = ( 390 | A9ED7A0A287776E100B95821 /* BTTStreamDeckPluginCPUUsage-Bridging-Header.h */, 391 | A9ED7A062877767300B95821 /* icon.png */, 392 | A9ED7A072877767300B95821 /* icon@2x.png */, 393 | A9ED7A022877753800B95821 /* Info.plist */, 394 | A9D31E5D287823450073D6A4 /* MyCpuUsage.swift */, 395 | A9ED7A042877762F00B95821 /* CPUUsagePlugin.swift */, 396 | ); 397 | path = BTTStreamDeckPluginCPUUsage; 398 | sourceTree = ""; 399 | }; 400 | /* End PBXGroup section */ 401 | 402 | /* Begin PBXHeadersBuildPhase section */ 403 | A9454C4522BE69BA00055860 /* Headers */ = { 404 | isa = PBXHeadersBuildPhase; 405 | buildActionMask = 2147483647; 406 | files = ( 407 | A9454C5C22BE69BA00055860 /* BTTPluginSupport.h in Headers */, 408 | ); 409 | runOnlyForDeploymentPostprocessing = 0; 410 | }; 411 | /* End PBXHeadersBuildPhase section */ 412 | 413 | /* Begin PBXNativeTarget section */ 414 | A9454BBD22BE1E3300055860 /* BetterTouchToolPluginDevelopment */ = { 415 | isa = PBXNativeTarget; 416 | buildConfigurationList = A9454BE822BE1E3500055860 /* Build configuration list for PBXNativeTarget "BetterTouchToolPluginDevelopment" */; 417 | buildPhases = ( 418 | A9454BBA22BE1E3300055860 /* Sources */, 419 | A9454BBB22BE1E3300055860 /* Frameworks */, 420 | A9454BBC22BE1E3300055860 /* Resources */, 421 | A9454C6422BE69BA00055860 /* Embed Frameworks */, 422 | ); 423 | buildRules = ( 424 | ); 425 | dependencies = ( 426 | A9C1C5CB287A27A500A78C42 /* PBXTargetDependency */, 427 | A9C1C5C9287A273E00A78C42 /* PBXTargetDependency */, 428 | A9454C1E22BE1FF000055860 /* PBXTargetDependency */, 429 | A9454C1C22BE1FED00055860 /* PBXTargetDependency */, 430 | A9454C1A22BE1FEA00055860 /* PBXTargetDependency */, 431 | A9454C5E22BE69BA00055860 /* PBXTargetDependency */, 432 | ); 433 | name = BetterTouchToolPluginDevelopment; 434 | productName = BetterTouchToolPluginDevelopment; 435 | productReference = A9454BBE22BE1E3300055860 /* BetterTouchToolPluginDevelopment.app */; 436 | productType = "com.apple.product-type.application"; 437 | }; 438 | A9454BF422BE1E7D00055860 /* BTTTouchBarSampleCustomButton */ = { 439 | isa = PBXNativeTarget; 440 | buildConfigurationList = A9454BF822BE1E7D00055860 /* Build configuration list for PBXNativeTarget "BTTTouchBarSampleCustomButton" */; 441 | buildPhases = ( 442 | A9454BF122BE1E7D00055860 /* Sources */, 443 | A9454BF222BE1E7D00055860 /* Frameworks */, 444 | A9454BF322BE1E7D00055860 /* Resources */, 445 | ); 446 | buildRules = ( 447 | ); 448 | dependencies = ( 449 | A9454C6B22BE6A0600055860 /* PBXTargetDependency */, 450 | ); 451 | name = BTTTouchBarSampleCustomButton; 452 | productName = BTTTouchBarSampleCustomButton; 453 | productReference = A9454BF522BE1E7D00055860 /* BTTTouchBarSampleCustomButton.btttouchbarplugin */; 454 | productType = "com.apple.product-type.bundle"; 455 | }; 456 | A9454BFE22BE1E9900055860 /* BTTTouchBarPluginSampleCustomView */ = { 457 | isa = PBXNativeTarget; 458 | buildConfigurationList = A9454C0222BE1E9900055860 /* Build configuration list for PBXNativeTarget "BTTTouchBarPluginSampleCustomView" */; 459 | buildPhases = ( 460 | A9454BFB22BE1E9900055860 /* Sources */, 461 | A9454BFC22BE1E9900055860 /* Frameworks */, 462 | A9454BFD22BE1E9900055860 /* Resources */, 463 | ); 464 | buildRules = ( 465 | ); 466 | dependencies = ( 467 | A9454C6D22BE6A0D00055860 /* PBXTargetDependency */, 468 | ); 469 | name = BTTTouchBarPluginSampleCustomView; 470 | productName = BTTTouchBarPluginSampleCustomView; 471 | productReference = A9454BFF22BE1E9900055860 /* BTTTouchBarPluginSampleCustomView.btttouchbarplugin */; 472 | productType = "com.apple.product-type.bundle"; 473 | }; 474 | A9454C0822BE1EC600055860 /* BTTTouchBarPluginSampleCustomString */ = { 475 | isa = PBXNativeTarget; 476 | buildConfigurationList = A9454C0C22BE1EC600055860 /* Build configuration list for PBXNativeTarget "BTTTouchBarPluginSampleCustomString" */; 477 | buildPhases = ( 478 | A9454C0522BE1EC600055860 /* Sources */, 479 | A9454C0622BE1EC600055860 /* Frameworks */, 480 | A9454C0722BE1EC600055860 /* Resources */, 481 | ); 482 | buildRules = ( 483 | ); 484 | dependencies = ( 485 | A9454C6F22BE6A1300055860 /* PBXTargetDependency */, 486 | ); 487 | name = BTTTouchBarPluginSampleCustomString; 488 | productName = BTTTouchBarPluginSampleCustomString; 489 | productReference = A9454C0922BE1EC600055860 /* BTTTouchBarPluginSampleCustomString.btttouchbarplugin */; 490 | productType = "com.apple.product-type.bundle"; 491 | }; 492 | A9454C4922BE69BA00055860 /* BTTPluginSupport */ = { 493 | isa = PBXNativeTarget; 494 | buildConfigurationList = A9454C6122BE69BA00055860 /* Build configuration list for PBXNativeTarget "BTTPluginSupport" */; 495 | buildPhases = ( 496 | A9454C4522BE69BA00055860 /* Headers */, 497 | A9454C4622BE69BA00055860 /* Sources */, 498 | A9454C4722BE69BA00055860 /* Frameworks */, 499 | A9454C4822BE69BA00055860 /* Resources */, 500 | ); 501 | buildRules = ( 502 | ); 503 | dependencies = ( 504 | ); 505 | name = BTTPluginSupport; 506 | productName = BTTPluginSupport; 507 | productReference = A9454C4A22BE69BA00055860 /* BTTPluginSupport.framework */; 508 | productType = "com.apple.product-type.framework"; 509 | }; 510 | A9DC034423D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin */ = { 511 | isa = PBXNativeTarget; 512 | buildConfigurationList = A9DC034823D4AEB900C0E704 /* Build configuration list for PBXNativeTarget "BTTDisplayNotificationActionPlugin" */; 513 | buildPhases = ( 514 | A9DC034123D4AEB900C0E704 /* Sources */, 515 | A9DC034223D4AEB900C0E704 /* Frameworks */, 516 | A9DC034323D4AEB900C0E704 /* Resources */, 517 | A9DC035623D4B59200C0E704 /* Embed Frameworks */, 518 | ); 519 | buildRules = ( 520 | ); 521 | dependencies = ( 522 | A9DC035523D4B59200C0E704 /* PBXTargetDependency */, 523 | ); 524 | name = BTTDisplayNotificationActionPlugin; 525 | productName = BTTDisplayNotificationActionPlugin; 526 | productReference = A9DC034523D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin.bttactionplugin */; 527 | productType = "com.apple.product-type.bundle"; 528 | }; 529 | A9ED79F42877753800B95821 /* BTTStreamDeckPluginCPUUsage */ = { 530 | isa = PBXNativeTarget; 531 | buildConfigurationList = A9ED79FE2877753800B95821 /* Build configuration list for PBXNativeTarget "BTTStreamDeckPluginCPUUsage" */; 532 | buildPhases = ( 533 | A9ED79F72877753800B95821 /* Sources */, 534 | A9ED79F92877753800B95821 /* Frameworks */, 535 | A9ED79FB2877753800B95821 /* Resources */, 536 | ); 537 | buildRules = ( 538 | ); 539 | dependencies = ( 540 | A9ED79F52877753800B95821 /* PBXTargetDependency */, 541 | ); 542 | name = BTTStreamDeckPluginCPUUsage; 543 | productName = BTTTouchBarSampleCustomButton; 544 | productReference = A9ED7A012877753800B95821 /* BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin */; 545 | productType = "com.apple.product-type.bundle"; 546 | }; 547 | /* End PBXNativeTarget section */ 548 | 549 | /* Begin PBXProject section */ 550 | A9454BB622BE1E3300055860 /* Project object */ = { 551 | isa = PBXProject; 552 | attributes = { 553 | LastUpgradeCheck = 1400; 554 | ORGANIZATIONNAME = "Andreas Hegenberg"; 555 | TargetAttributes = { 556 | A9454BBD22BE1E3300055860 = { 557 | CreatedOnToolsVersion = 10.2.1; 558 | SystemCapabilities = { 559 | com.apple.Sandbox = { 560 | enabled = 0; 561 | }; 562 | }; 563 | }; 564 | A9454BF422BE1E7D00055860 = { 565 | CreatedOnToolsVersion = 10.2.1; 566 | LastSwiftMigration = 1020; 567 | }; 568 | A9454BFE22BE1E9900055860 = { 569 | CreatedOnToolsVersion = 10.2.1; 570 | LastSwiftMigration = 1020; 571 | }; 572 | A9454C0822BE1EC600055860 = { 573 | CreatedOnToolsVersion = 10.2.1; 574 | LastSwiftMigration = 1020; 575 | }; 576 | A9454C4922BE69BA00055860 = { 577 | CreatedOnToolsVersion = 10.2.1; 578 | }; 579 | A9DC034423D4AEB900C0E704 = { 580 | CreatedOnToolsVersion = 11.3.1; 581 | LastSwiftMigration = 1130; 582 | }; 583 | }; 584 | }; 585 | buildConfigurationList = A9454BB922BE1E3300055860 /* Build configuration list for PBXProject "BetterTouchToolPluginDevelopment" */; 586 | compatibilityVersion = "Xcode 9.3"; 587 | developmentRegion = en; 588 | hasScannedForEncodings = 0; 589 | knownRegions = ( 590 | en, 591 | Base, 592 | ); 593 | mainGroup = A9454BB522BE1E3300055860; 594 | productRefGroup = A9454BBF22BE1E3300055860 /* Products */; 595 | projectDirPath = ""; 596 | projectRoot = ""; 597 | targets = ( 598 | A9454BBD22BE1E3300055860 /* BetterTouchToolPluginDevelopment */, 599 | A9454BF422BE1E7D00055860 /* BTTTouchBarSampleCustomButton */, 600 | A9454BFE22BE1E9900055860 /* BTTTouchBarPluginSampleCustomView */, 601 | A9454C0822BE1EC600055860 /* BTTTouchBarPluginSampleCustomString */, 602 | A9DC034423D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin */, 603 | A9ED79F42877753800B95821 /* BTTStreamDeckPluginCPUUsage */, 604 | A9454C4922BE69BA00055860 /* BTTPluginSupport */, 605 | ); 606 | }; 607 | /* End PBXProject section */ 608 | 609 | /* Begin PBXResourcesBuildPhase section */ 610 | A9454BBC22BE1E3300055860 /* Resources */ = { 611 | isa = PBXResourcesBuildPhase; 612 | buildActionMask = 2147483647; 613 | files = ( 614 | A9454BC822BE1E3500055860 /* Assets.xcassets in Resources */, 615 | A9454BCB22BE1E3500055860 /* Main.storyboard in Resources */, 616 | ); 617 | runOnlyForDeploymentPostprocessing = 0; 618 | }; 619 | A9454BF322BE1E7D00055860 /* Resources */ = { 620 | isa = PBXResourcesBuildPhase; 621 | buildActionMask = 2147483647; 622 | files = ( 623 | A9454C3822BE224500055860 /* icon.png in Resources */, 624 | A9454C3922BE224500055860 /* icon@2x.png in Resources */, 625 | ); 626 | runOnlyForDeploymentPostprocessing = 0; 627 | }; 628 | A9454BFD22BE1E9900055860 /* Resources */ = { 629 | isa = PBXResourcesBuildPhase; 630 | buildActionMask = 2147483647; 631 | files = ( 632 | A9454C3C22BE24D700055860 /* icon.png in Resources */, 633 | A9454C3D22BE24D700055860 /* icon@2x.png in Resources */, 634 | ); 635 | runOnlyForDeploymentPostprocessing = 0; 636 | }; 637 | A9454C0722BE1EC600055860 /* Resources */ = { 638 | isa = PBXResourcesBuildPhase; 639 | buildActionMask = 2147483647; 640 | files = ( 641 | A9454C4122BE24E200055860 /* icon.png in Resources */, 642 | A9454C4022BE24E200055860 /* icon@2x.png in Resources */, 643 | ); 644 | runOnlyForDeploymentPostprocessing = 0; 645 | }; 646 | A9454C4822BE69BA00055860 /* Resources */ = { 647 | isa = PBXResourcesBuildPhase; 648 | buildActionMask = 2147483647; 649 | files = ( 650 | ); 651 | runOnlyForDeploymentPostprocessing = 0; 652 | }; 653 | A9DC034323D4AEB900C0E704 /* Resources */ = { 654 | isa = PBXResourcesBuildPhase; 655 | buildActionMask = 2147483647; 656 | files = ( 657 | A9DC035023D4B3A100C0E704 /* icon.png in Resources */, 658 | A9DC035123D4B3A100C0E704 /* icon@2x.png in Resources */, 659 | ); 660 | runOnlyForDeploymentPostprocessing = 0; 661 | }; 662 | A9ED79FB2877753800B95821 /* Resources */ = { 663 | isa = PBXResourcesBuildPhase; 664 | buildActionMask = 2147483647; 665 | files = ( 666 | A9ED7A092877767300B95821 /* icon@2x.png in Resources */, 667 | A9ED7A082877767300B95821 /* icon.png in Resources */, 668 | ); 669 | runOnlyForDeploymentPostprocessing = 0; 670 | }; 671 | /* End PBXResourcesBuildPhase section */ 672 | 673 | /* Begin PBXSourcesBuildPhase section */ 674 | A9454BBA22BE1E3300055860 /* Sources */ = { 675 | isa = PBXSourcesBuildPhase; 676 | buildActionMask = 2147483647; 677 | files = ( 678 | A9454C7622BE6B4F00055860 /* WindowController.m in Sources */, 679 | A9454BC622BE1E3300055860 /* ViewController.m in Sources */, 680 | A9454BCE22BE1E3500055860 /* main.m in Sources */, 681 | A9454BC322BE1E3300055860 /* AppDelegate.m in Sources */, 682 | A9454C4422BE324900055860 /* DemoTouchBarViewController.m in Sources */, 683 | ); 684 | runOnlyForDeploymentPostprocessing = 0; 685 | }; 686 | A9454BF122BE1E7D00055860 /* Sources */ = { 687 | isa = PBXSourcesBuildPhase; 688 | buildActionMask = 2147483647; 689 | files = ( 690 | A9454C1222BE1F7700055860 /* SamplePluginCustomButton.swift in Sources */, 691 | ); 692 | runOnlyForDeploymentPostprocessing = 0; 693 | }; 694 | A9454BFB22BE1E9900055860 /* Sources */ = { 695 | isa = PBXSourcesBuildPhase; 696 | buildActionMask = 2147483647; 697 | files = ( 698 | A9454C3522BE219400055860 /* CustomViewVC.swift in Sources */, 699 | A9454C1522BE1F9100055860 /* SamplePluginCustomView.swift in Sources */, 700 | ); 701 | runOnlyForDeploymentPostprocessing = 0; 702 | }; 703 | A9454C0522BE1EC600055860 /* Sources */ = { 704 | isa = PBXSourcesBuildPhase; 705 | buildActionMask = 2147483647; 706 | files = ( 707 | A9454C1822BE1FA300055860 /* SamplePluginCustomString.swift in Sources */, 708 | ); 709 | runOnlyForDeploymentPostprocessing = 0; 710 | }; 711 | A9454C4622BE69BA00055860 /* Sources */ = { 712 | isa = PBXSourcesBuildPhase; 713 | buildActionMask = 2147483647; 714 | files = ( 715 | A9454C6922BE69C700055860 /* BTTPluginFormItem.m in Sources */, 716 | A9454C6822BE69C700055860 /* BTTFormConstants.m in Sources */, 717 | ); 718 | runOnlyForDeploymentPostprocessing = 0; 719 | }; 720 | A9DC034123D4AEB900C0E704 /* Sources */ = { 721 | isa = PBXSourcesBuildPhase; 722 | buildActionMask = 2147483647; 723 | files = ( 724 | A9DC034D23D4AF5600C0E704 /* ShowNotificationPlugin.swift in Sources */, 725 | ); 726 | runOnlyForDeploymentPostprocessing = 0; 727 | }; 728 | A9ED79F72877753800B95821 /* Sources */ = { 729 | isa = PBXSourcesBuildPhase; 730 | buildActionMask = 2147483647; 731 | files = ( 732 | A9D31E5E287823450073D6A4 /* MyCpuUsage.swift in Sources */, 733 | A9ED7A052877762F00B95821 /* CPUUsagePlugin.swift in Sources */, 734 | ); 735 | runOnlyForDeploymentPostprocessing = 0; 736 | }; 737 | /* End PBXSourcesBuildPhase section */ 738 | 739 | /* Begin PBXTargetDependency section */ 740 | A9454C1A22BE1FEA00055860 /* PBXTargetDependency */ = { 741 | isa = PBXTargetDependency; 742 | target = A9454BF422BE1E7D00055860 /* BTTTouchBarSampleCustomButton */; 743 | targetProxy = A9454C1922BE1FEA00055860 /* PBXContainerItemProxy */; 744 | }; 745 | A9454C1C22BE1FED00055860 /* PBXTargetDependency */ = { 746 | isa = PBXTargetDependency; 747 | target = A9454BFE22BE1E9900055860 /* BTTTouchBarPluginSampleCustomView */; 748 | targetProxy = A9454C1B22BE1FED00055860 /* PBXContainerItemProxy */; 749 | }; 750 | A9454C1E22BE1FF000055860 /* PBXTargetDependency */ = { 751 | isa = PBXTargetDependency; 752 | target = A9454C0822BE1EC600055860 /* BTTTouchBarPluginSampleCustomString */; 753 | targetProxy = A9454C1D22BE1FF000055860 /* PBXContainerItemProxy */; 754 | }; 755 | A9454C5E22BE69BA00055860 /* PBXTargetDependency */ = { 756 | isa = PBXTargetDependency; 757 | target = A9454C4922BE69BA00055860 /* BTTPluginSupport */; 758 | targetProxy = A9454C5D22BE69BA00055860 /* PBXContainerItemProxy */; 759 | }; 760 | A9454C6B22BE6A0600055860 /* PBXTargetDependency */ = { 761 | isa = PBXTargetDependency; 762 | target = A9454C4922BE69BA00055860 /* BTTPluginSupport */; 763 | targetProxy = A9454C6A22BE6A0600055860 /* PBXContainerItemProxy */; 764 | }; 765 | A9454C6D22BE6A0D00055860 /* PBXTargetDependency */ = { 766 | isa = PBXTargetDependency; 767 | target = A9454C4922BE69BA00055860 /* BTTPluginSupport */; 768 | targetProxy = A9454C6C22BE6A0D00055860 /* PBXContainerItemProxy */; 769 | }; 770 | A9454C6F22BE6A1300055860 /* PBXTargetDependency */ = { 771 | isa = PBXTargetDependency; 772 | target = A9454C4922BE69BA00055860 /* BTTPluginSupport */; 773 | targetProxy = A9454C6E22BE6A1300055860 /* PBXContainerItemProxy */; 774 | }; 775 | A9C1C5C9287A273E00A78C42 /* PBXTargetDependency */ = { 776 | isa = PBXTargetDependency; 777 | target = A9ED79F42877753800B95821 /* BTTStreamDeckPluginCPUUsage */; 778 | targetProxy = A9C1C5C8287A273E00A78C42 /* PBXContainerItemProxy */; 779 | }; 780 | A9C1C5CB287A27A500A78C42 /* PBXTargetDependency */ = { 781 | isa = PBXTargetDependency; 782 | target = A9DC034423D4AEB900C0E704 /* BTTDisplayNotificationActionPlugin */; 783 | targetProxy = A9C1C5CA287A27A500A78C42 /* PBXContainerItemProxy */; 784 | }; 785 | A9DC035523D4B59200C0E704 /* PBXTargetDependency */ = { 786 | isa = PBXTargetDependency; 787 | target = A9454C4922BE69BA00055860 /* BTTPluginSupport */; 788 | targetProxy = A9DC035423D4B59200C0E704 /* PBXContainerItemProxy */; 789 | }; 790 | A9ED79F52877753800B95821 /* PBXTargetDependency */ = { 791 | isa = PBXTargetDependency; 792 | target = A9454C4922BE69BA00055860 /* BTTPluginSupport */; 793 | targetProxy = A9ED79F62877753800B95821 /* PBXContainerItemProxy */; 794 | }; 795 | /* End PBXTargetDependency section */ 796 | 797 | /* Begin PBXVariantGroup section */ 798 | A9454BC922BE1E3500055860 /* Main.storyboard */ = { 799 | isa = PBXVariantGroup; 800 | children = ( 801 | A9454BCA22BE1E3500055860 /* Base */, 802 | ); 803 | name = Main.storyboard; 804 | sourceTree = ""; 805 | }; 806 | /* End PBXVariantGroup section */ 807 | 808 | /* Begin XCBuildConfiguration section */ 809 | A9454BE622BE1E3500055860 /* Debug */ = { 810 | isa = XCBuildConfiguration; 811 | buildSettings = { 812 | ALWAYS_SEARCH_USER_PATHS = NO; 813 | CLANG_ANALYZER_NONNULL = YES; 814 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 815 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 816 | CLANG_CXX_LIBRARY = "libc++"; 817 | CLANG_ENABLE_MODULES = YES; 818 | CLANG_ENABLE_OBJC_ARC = YES; 819 | CLANG_ENABLE_OBJC_WEAK = YES; 820 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 821 | CLANG_WARN_BOOL_CONVERSION = YES; 822 | CLANG_WARN_COMMA = YES; 823 | CLANG_WARN_CONSTANT_CONVERSION = YES; 824 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 825 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 826 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 827 | CLANG_WARN_EMPTY_BODY = YES; 828 | CLANG_WARN_ENUM_CONVERSION = YES; 829 | CLANG_WARN_INFINITE_RECURSION = YES; 830 | CLANG_WARN_INT_CONVERSION = YES; 831 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 832 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 833 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 834 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 835 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 836 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 837 | CLANG_WARN_STRICT_PROTOTYPES = YES; 838 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 839 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 840 | CLANG_WARN_UNREACHABLE_CODE = YES; 841 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 842 | CODE_SIGN_IDENTITY = "Mac Developer"; 843 | COPY_PHASE_STRIP = NO; 844 | DEAD_CODE_STRIPPING = YES; 845 | DEBUG_INFORMATION_FORMAT = dwarf; 846 | ENABLE_STRICT_OBJC_MSGSEND = YES; 847 | ENABLE_TESTABILITY = YES; 848 | GCC_C_LANGUAGE_STANDARD = gnu11; 849 | GCC_DYNAMIC_NO_PIC = NO; 850 | GCC_NO_COMMON_BLOCKS = YES; 851 | GCC_OPTIMIZATION_LEVEL = 0; 852 | GCC_PREPROCESSOR_DEFINITIONS = ( 853 | "DEBUG=1", 854 | "$(inherited)", 855 | ); 856 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 857 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 858 | GCC_WARN_UNDECLARED_SELECTOR = YES; 859 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 860 | GCC_WARN_UNUSED_FUNCTION = YES; 861 | GCC_WARN_UNUSED_VARIABLE = YES; 862 | MACOSX_DEPLOYMENT_TARGET = 10.14; 863 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 864 | MTL_FAST_MATH = YES; 865 | ONLY_ACTIVE_ARCH = YES; 866 | SDKROOT = macosx; 867 | }; 868 | name = Debug; 869 | }; 870 | A9454BE722BE1E3500055860 /* Release */ = { 871 | isa = XCBuildConfiguration; 872 | buildSettings = { 873 | ALWAYS_SEARCH_USER_PATHS = NO; 874 | CLANG_ANALYZER_NONNULL = YES; 875 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 876 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 877 | CLANG_CXX_LIBRARY = "libc++"; 878 | CLANG_ENABLE_MODULES = YES; 879 | CLANG_ENABLE_OBJC_ARC = YES; 880 | CLANG_ENABLE_OBJC_WEAK = YES; 881 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 882 | CLANG_WARN_BOOL_CONVERSION = YES; 883 | CLANG_WARN_COMMA = YES; 884 | CLANG_WARN_CONSTANT_CONVERSION = YES; 885 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 886 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 887 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 888 | CLANG_WARN_EMPTY_BODY = YES; 889 | CLANG_WARN_ENUM_CONVERSION = YES; 890 | CLANG_WARN_INFINITE_RECURSION = YES; 891 | CLANG_WARN_INT_CONVERSION = YES; 892 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 893 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 894 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 895 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 896 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 897 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 898 | CLANG_WARN_STRICT_PROTOTYPES = YES; 899 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 900 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 901 | CLANG_WARN_UNREACHABLE_CODE = YES; 902 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 903 | CODE_SIGN_IDENTITY = "Mac Developer"; 904 | COPY_PHASE_STRIP = NO; 905 | DEAD_CODE_STRIPPING = YES; 906 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 907 | ENABLE_NS_ASSERTIONS = NO; 908 | ENABLE_STRICT_OBJC_MSGSEND = YES; 909 | GCC_C_LANGUAGE_STANDARD = gnu11; 910 | GCC_NO_COMMON_BLOCKS = YES; 911 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 912 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 913 | GCC_WARN_UNDECLARED_SELECTOR = YES; 914 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 915 | GCC_WARN_UNUSED_FUNCTION = YES; 916 | GCC_WARN_UNUSED_VARIABLE = YES; 917 | MACOSX_DEPLOYMENT_TARGET = 10.14; 918 | MTL_ENABLE_DEBUG_INFO = NO; 919 | MTL_FAST_MATH = YES; 920 | SDKROOT = macosx; 921 | SWIFT_COMPILATION_MODE = wholemodule; 922 | }; 923 | name = Release; 924 | }; 925 | A9454BE922BE1E3500055860 /* Debug */ = { 926 | isa = XCBuildConfiguration; 927 | buildSettings = { 928 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 929 | CODE_SIGN_IDENTITY = "-"; 930 | CODE_SIGN_STYLE = Automatic; 931 | COMBINE_HIDPI_IMAGES = YES; 932 | DEAD_CODE_STRIPPING = YES; 933 | DEVELOPMENT_TEAM = DAFVSXZ82P; 934 | INFOPLIST_FILE = BetterTouchToolPluginDevelopment/Info.plist; 935 | LD_RUNPATH_SEARCH_PATHS = ( 936 | "$(inherited)", 937 | "@executable_path/../Frameworks", 938 | ); 939 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BetterTouchToolPluginDevelopment; 940 | PRODUCT_NAME = "$(TARGET_NAME)"; 941 | }; 942 | name = Debug; 943 | }; 944 | A9454BEA22BE1E3500055860 /* Release */ = { 945 | isa = XCBuildConfiguration; 946 | buildSettings = { 947 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 948 | CODE_SIGN_IDENTITY = "-"; 949 | CODE_SIGN_STYLE = Automatic; 950 | COMBINE_HIDPI_IMAGES = YES; 951 | DEAD_CODE_STRIPPING = YES; 952 | DEVELOPMENT_TEAM = DAFVSXZ82P; 953 | INFOPLIST_FILE = BetterTouchToolPluginDevelopment/Info.plist; 954 | LD_RUNPATH_SEARCH_PATHS = ( 955 | "$(inherited)", 956 | "@executable_path/../Frameworks", 957 | ); 958 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BetterTouchToolPluginDevelopment; 959 | PRODUCT_NAME = "$(TARGET_NAME)"; 960 | }; 961 | name = Release; 962 | }; 963 | A9454BF922BE1E7D00055860 /* Debug */ = { 964 | isa = XCBuildConfiguration; 965 | buildSettings = { 966 | CLANG_ENABLE_MODULES = YES; 967 | CODE_SIGN_IDENTITY = "Mac Developer"; 968 | CODE_SIGN_STYLE = Automatic; 969 | COMBINE_HIDPI_IMAGES = YES; 970 | DEAD_CODE_STRIPPING = YES; 971 | DEVELOPMENT_TEAM = DAFVSXZ82P; 972 | INFOPLIST_FILE = BTTTouchBarSampleCustomButton/Info.plist; 973 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 974 | LD_RUNPATH_SEARCH_PATHS = ( 975 | "$(inherited)", 976 | "@executable_path/../Frameworks", 977 | "@loader_path/../Frameworks", 978 | ); 979 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTTouchBarSampleCustomButton; 980 | PRODUCT_NAME = "$(TARGET_NAME)"; 981 | PROVISIONING_PROFILE_SPECIFIER = ""; 982 | SWIFT_OBJC_BRIDGING_HEADER = "BTTTouchBarSampleCustomButton/BTTTouchBarSampleCustomButton-Bridging-Header.h"; 983 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 984 | SWIFT_VERSION = 5.0; 985 | WRAPPER_EXTENSION = btttouchbarplugin; 986 | }; 987 | name = Debug; 988 | }; 989 | A9454BFA22BE1E7D00055860 /* Release */ = { 990 | isa = XCBuildConfiguration; 991 | buildSettings = { 992 | CLANG_ENABLE_MODULES = YES; 993 | CODE_SIGN_IDENTITY = "Mac Developer"; 994 | CODE_SIGN_STYLE = Automatic; 995 | COMBINE_HIDPI_IMAGES = YES; 996 | DEAD_CODE_STRIPPING = YES; 997 | DEVELOPMENT_TEAM = DAFVSXZ82P; 998 | INFOPLIST_FILE = BTTTouchBarSampleCustomButton/Info.plist; 999 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1000 | LD_RUNPATH_SEARCH_PATHS = ( 1001 | "$(inherited)", 1002 | "@executable_path/../Frameworks", 1003 | "@loader_path/../Frameworks", 1004 | ); 1005 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTTouchBarSampleCustomButton; 1006 | PRODUCT_NAME = "$(TARGET_NAME)"; 1007 | PROVISIONING_PROFILE_SPECIFIER = ""; 1008 | SWIFT_OBJC_BRIDGING_HEADER = "BTTTouchBarSampleCustomButton/BTTTouchBarSampleCustomButton-Bridging-Header.h"; 1009 | SWIFT_VERSION = 5.0; 1010 | WRAPPER_EXTENSION = btttouchbarplugin; 1011 | }; 1012 | name = Release; 1013 | }; 1014 | A9454C0322BE1E9900055860 /* Debug */ = { 1015 | isa = XCBuildConfiguration; 1016 | buildSettings = { 1017 | CLANG_ENABLE_MODULES = YES; 1018 | CODE_SIGN_STYLE = Automatic; 1019 | COMBINE_HIDPI_IMAGES = YES; 1020 | DEAD_CODE_STRIPPING = YES; 1021 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1022 | INFOPLIST_FILE = BTTTouchBarPluginSampleCustomView/Info.plist; 1023 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1024 | LD_RUNPATH_SEARCH_PATHS = ( 1025 | "$(inherited)", 1026 | "@executable_path/../Frameworks", 1027 | "@loader_path/../Frameworks", 1028 | ); 1029 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTTouchBarPluginSampleCustomView; 1030 | PRODUCT_NAME = "$(TARGET_NAME)"; 1031 | SWIFT_OBJC_BRIDGING_HEADER = "BTTTouchBarPluginSampleCustomView/BTTTouchBarPluginSampleCustomView-Bridging-Header.h"; 1032 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1033 | SWIFT_VERSION = 5.0; 1034 | WRAPPER_EXTENSION = btttouchbarplugin; 1035 | }; 1036 | name = Debug; 1037 | }; 1038 | A9454C0422BE1E9900055860 /* Release */ = { 1039 | isa = XCBuildConfiguration; 1040 | buildSettings = { 1041 | CLANG_ENABLE_MODULES = YES; 1042 | CODE_SIGN_STYLE = Automatic; 1043 | COMBINE_HIDPI_IMAGES = YES; 1044 | DEAD_CODE_STRIPPING = YES; 1045 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1046 | INFOPLIST_FILE = BTTTouchBarPluginSampleCustomView/Info.plist; 1047 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1048 | LD_RUNPATH_SEARCH_PATHS = ( 1049 | "$(inherited)", 1050 | "@executable_path/../Frameworks", 1051 | "@loader_path/../Frameworks", 1052 | ); 1053 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTTouchBarPluginSampleCustomView; 1054 | PRODUCT_NAME = "$(TARGET_NAME)"; 1055 | SWIFT_OBJC_BRIDGING_HEADER = "BTTTouchBarPluginSampleCustomView/BTTTouchBarPluginSampleCustomView-Bridging-Header.h"; 1056 | SWIFT_VERSION = 5.0; 1057 | WRAPPER_EXTENSION = btttouchbarplugin; 1058 | }; 1059 | name = Release; 1060 | }; 1061 | A9454C0D22BE1EC600055860 /* Debug */ = { 1062 | isa = XCBuildConfiguration; 1063 | buildSettings = { 1064 | CLANG_ENABLE_MODULES = YES; 1065 | CODE_SIGN_STYLE = Automatic; 1066 | COMBINE_HIDPI_IMAGES = YES; 1067 | DEAD_CODE_STRIPPING = YES; 1068 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1069 | INFOPLIST_FILE = BTTTouchBarPluginSampleCustomString/Info.plist; 1070 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1071 | LD_RUNPATH_SEARCH_PATHS = ( 1072 | "$(inherited)", 1073 | "@executable_path/../Frameworks", 1074 | "@loader_path/../Frameworks", 1075 | ); 1076 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTTouchBarPluginSampleCustomString; 1077 | PRODUCT_NAME = "$(TARGET_NAME)"; 1078 | SWIFT_OBJC_BRIDGING_HEADER = "BTTTouchBarPluginSampleCustomString/BTTTouchBarPluginSampleCustomString-Bridging-Header.h"; 1079 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1080 | SWIFT_VERSION = 5.0; 1081 | WRAPPER_EXTENSION = btttouchbarplugin; 1082 | }; 1083 | name = Debug; 1084 | }; 1085 | A9454C0E22BE1EC600055860 /* Release */ = { 1086 | isa = XCBuildConfiguration; 1087 | buildSettings = { 1088 | CLANG_ENABLE_MODULES = YES; 1089 | CODE_SIGN_STYLE = Automatic; 1090 | COMBINE_HIDPI_IMAGES = YES; 1091 | DEAD_CODE_STRIPPING = YES; 1092 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1093 | INFOPLIST_FILE = BTTTouchBarPluginSampleCustomString/Info.plist; 1094 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1095 | LD_RUNPATH_SEARCH_PATHS = ( 1096 | "$(inherited)", 1097 | "@executable_path/../Frameworks", 1098 | "@loader_path/../Frameworks", 1099 | ); 1100 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTTouchBarPluginSampleCustomString; 1101 | PRODUCT_NAME = "$(TARGET_NAME)"; 1102 | SWIFT_OBJC_BRIDGING_HEADER = "BTTTouchBarPluginSampleCustomString/BTTTouchBarPluginSampleCustomString-Bridging-Header.h"; 1103 | SWIFT_VERSION = 5.0; 1104 | WRAPPER_EXTENSION = btttouchbarplugin; 1105 | }; 1106 | name = Release; 1107 | }; 1108 | A9454C6222BE69BA00055860 /* Debug */ = { 1109 | isa = XCBuildConfiguration; 1110 | buildSettings = { 1111 | CODE_SIGN_IDENTITY = ""; 1112 | CODE_SIGN_STYLE = Automatic; 1113 | COMBINE_HIDPI_IMAGES = YES; 1114 | CURRENT_PROJECT_VERSION = 1; 1115 | DEAD_CODE_STRIPPING = YES; 1116 | DEFINES_MODULE = YES; 1117 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1118 | DYLIB_COMPATIBILITY_VERSION = 1; 1119 | DYLIB_CURRENT_VERSION = 1; 1120 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1121 | FRAMEWORK_VERSION = A; 1122 | INFOPLIST_FILE = BTTPluginSupport/Info.plist; 1123 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1124 | LD_RUNPATH_SEARCH_PATHS = ( 1125 | "$(inherited)", 1126 | "@executable_path/../Frameworks", 1127 | "@loader_path/Frameworks", 1128 | ); 1129 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTPluginSupport; 1130 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 1131 | SKIP_INSTALL = YES; 1132 | VERSIONING_SYSTEM = "apple-generic"; 1133 | VERSION_INFO_PREFIX = ""; 1134 | }; 1135 | name = Debug; 1136 | }; 1137 | A9454C6322BE69BA00055860 /* Release */ = { 1138 | isa = XCBuildConfiguration; 1139 | buildSettings = { 1140 | CODE_SIGN_IDENTITY = ""; 1141 | CODE_SIGN_STYLE = Automatic; 1142 | COMBINE_HIDPI_IMAGES = YES; 1143 | CURRENT_PROJECT_VERSION = 1; 1144 | DEAD_CODE_STRIPPING = YES; 1145 | DEFINES_MODULE = YES; 1146 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1147 | DYLIB_COMPATIBILITY_VERSION = 1; 1148 | DYLIB_CURRENT_VERSION = 1; 1149 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1150 | FRAMEWORK_VERSION = A; 1151 | INFOPLIST_FILE = BTTPluginSupport/Info.plist; 1152 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1153 | LD_RUNPATH_SEARCH_PATHS = ( 1154 | "$(inherited)", 1155 | "@executable_path/../Frameworks", 1156 | "@loader_path/Frameworks", 1157 | ); 1158 | PRODUCT_BUNDLE_IDENTIFIER = com.hegenberg.BTTPluginSupport; 1159 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 1160 | SKIP_INSTALL = YES; 1161 | VERSIONING_SYSTEM = "apple-generic"; 1162 | VERSION_INFO_PREFIX = ""; 1163 | }; 1164 | name = Release; 1165 | }; 1166 | A9DC034923D4AEB900C0E704 /* Debug */ = { 1167 | isa = XCBuildConfiguration; 1168 | buildSettings = { 1169 | CLANG_ENABLE_MODULES = YES; 1170 | CODE_SIGN_STYLE = Automatic; 1171 | COMBINE_HIDPI_IMAGES = YES; 1172 | DEAD_CODE_STRIPPING = YES; 1173 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1174 | INFOPLIST_FILE = BTTDisplayNotificationActionPlugin/Info.plist; 1175 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1176 | LD_RUNPATH_SEARCH_PATHS = ( 1177 | "$(inherited)", 1178 | "@executable_path/../Frameworks", 1179 | "@loader_path/../Frameworks", 1180 | ); 1181 | MACOSX_DEPLOYMENT_TARGET = 10.15; 1182 | PRODUCT_BUNDLE_IDENTIFIER = com.folivora.BTTDisplayNotificationActionPlugin; 1183 | PRODUCT_NAME = "$(TARGET_NAME)"; 1184 | SWIFT_OBJC_BRIDGING_HEADER = "BTTDisplayNotificationActionPlugin/BTTDisplayNotificationActionPlugin-Bridging-Header.h"; 1185 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1186 | SWIFT_VERSION = 5.0; 1187 | WRAPPER_EXTENSION = bttactionplugin; 1188 | }; 1189 | name = Debug; 1190 | }; 1191 | A9DC034A23D4AEB900C0E704 /* Release */ = { 1192 | isa = XCBuildConfiguration; 1193 | buildSettings = { 1194 | CLANG_ENABLE_MODULES = YES; 1195 | CODE_SIGN_STYLE = Automatic; 1196 | COMBINE_HIDPI_IMAGES = YES; 1197 | DEAD_CODE_STRIPPING = YES; 1198 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1199 | INFOPLIST_FILE = BTTDisplayNotificationActionPlugin/Info.plist; 1200 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1201 | LD_RUNPATH_SEARCH_PATHS = ( 1202 | "$(inherited)", 1203 | "@executable_path/../Frameworks", 1204 | "@loader_path/../Frameworks", 1205 | ); 1206 | MACOSX_DEPLOYMENT_TARGET = 10.15; 1207 | PRODUCT_BUNDLE_IDENTIFIER = com.folivora.BTTDisplayNotificationActionPlugin; 1208 | PRODUCT_NAME = "$(TARGET_NAME)"; 1209 | SWIFT_OBJC_BRIDGING_HEADER = "BTTDisplayNotificationActionPlugin/BTTDisplayNotificationActionPlugin-Bridging-Header.h"; 1210 | SWIFT_VERSION = 5.0; 1211 | WRAPPER_EXTENSION = bttactionplugin; 1212 | }; 1213 | name = Release; 1214 | }; 1215 | A9ED79FF2877753800B95821 /* Debug */ = { 1216 | isa = XCBuildConfiguration; 1217 | buildSettings = { 1218 | CLANG_ENABLE_MODULES = YES; 1219 | CODE_SIGN_IDENTITY = "Mac Developer"; 1220 | CODE_SIGN_STYLE = Automatic; 1221 | COMBINE_HIDPI_IMAGES = YES; 1222 | DEAD_CODE_STRIPPING = YES; 1223 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1224 | ENABLE_HARDENED_RUNTIME = YES; 1225 | INFOPLIST_FILE = BTTStreamDeckPluginCPUUsage/Info.plist; 1226 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1227 | LD_RUNPATH_SEARCH_PATHS = ( 1228 | "$(inherited)", 1229 | "@executable_path/../Frameworks", 1230 | "@loader_path/../Frameworks", 1231 | ); 1232 | PRODUCT_BUNDLE_IDENTIFIER = com.folivora.sd.cpuusage; 1233 | PRODUCT_NAME = "$(TARGET_NAME)"; 1234 | PROVISIONING_PROFILE_SPECIFIER = ""; 1235 | SKIP_INSTALL = NO; 1236 | SWIFT_OBJC_BRIDGING_HEADER = "BTTStreamDeckPluginCPUUsage/BTTStreamDeckPluginCPUUsage-Bridging-Header.h"; 1237 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1238 | SWIFT_VERSION = 5.0; 1239 | WRAPPER_EXTENSION = bttstreamdeckplugin; 1240 | }; 1241 | name = Debug; 1242 | }; 1243 | A9ED7A002877753800B95821 /* Release */ = { 1244 | isa = XCBuildConfiguration; 1245 | buildSettings = { 1246 | CLANG_ENABLE_MODULES = YES; 1247 | CODE_SIGN_IDENTITY = "Apple Development"; 1248 | CODE_SIGN_STYLE = Manual; 1249 | COMBINE_HIDPI_IMAGES = YES; 1250 | DEAD_CODE_STRIPPING = YES; 1251 | DEVELOPMENT_TEAM = DAFVSXZ82P; 1252 | ENABLE_HARDENED_RUNTIME = YES; 1253 | INFOPLIST_FILE = BTTStreamDeckPluginCPUUsage/Info.plist; 1254 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; 1255 | LD_RUNPATH_SEARCH_PATHS = ( 1256 | "$(inherited)", 1257 | "@executable_path/../Frameworks", 1258 | "@loader_path/../Frameworks", 1259 | ); 1260 | PRODUCT_BUNDLE_IDENTIFIER = com.folivora.sd.cpuusage; 1261 | PRODUCT_NAME = "$(TARGET_NAME)"; 1262 | PROVISIONING_PROFILE_SPECIFIER = ""; 1263 | SKIP_INSTALL = NO; 1264 | SWIFT_OBJC_BRIDGING_HEADER = "BTTStreamDeckPluginCPUUsage/BTTStreamDeckPluginCPUUsage-Bridging-Header.h"; 1265 | SWIFT_VERSION = 5.0; 1266 | WRAPPER_EXTENSION = bttstreamdeckplugin; 1267 | }; 1268 | name = Release; 1269 | }; 1270 | /* End XCBuildConfiguration section */ 1271 | 1272 | /* Begin XCConfigurationList section */ 1273 | A9454BB922BE1E3300055860 /* Build configuration list for PBXProject "BetterTouchToolPluginDevelopment" */ = { 1274 | isa = XCConfigurationList; 1275 | buildConfigurations = ( 1276 | A9454BE622BE1E3500055860 /* Debug */, 1277 | A9454BE722BE1E3500055860 /* Release */, 1278 | ); 1279 | defaultConfigurationIsVisible = 0; 1280 | defaultConfigurationName = Release; 1281 | }; 1282 | A9454BE822BE1E3500055860 /* Build configuration list for PBXNativeTarget "BetterTouchToolPluginDevelopment" */ = { 1283 | isa = XCConfigurationList; 1284 | buildConfigurations = ( 1285 | A9454BE922BE1E3500055860 /* Debug */, 1286 | A9454BEA22BE1E3500055860 /* Release */, 1287 | ); 1288 | defaultConfigurationIsVisible = 0; 1289 | defaultConfigurationName = Release; 1290 | }; 1291 | A9454BF822BE1E7D00055860 /* Build configuration list for PBXNativeTarget "BTTTouchBarSampleCustomButton" */ = { 1292 | isa = XCConfigurationList; 1293 | buildConfigurations = ( 1294 | A9454BF922BE1E7D00055860 /* Debug */, 1295 | A9454BFA22BE1E7D00055860 /* Release */, 1296 | ); 1297 | defaultConfigurationIsVisible = 0; 1298 | defaultConfigurationName = Release; 1299 | }; 1300 | A9454C0222BE1E9900055860 /* Build configuration list for PBXNativeTarget "BTTTouchBarPluginSampleCustomView" */ = { 1301 | isa = XCConfigurationList; 1302 | buildConfigurations = ( 1303 | A9454C0322BE1E9900055860 /* Debug */, 1304 | A9454C0422BE1E9900055860 /* Release */, 1305 | ); 1306 | defaultConfigurationIsVisible = 0; 1307 | defaultConfigurationName = Release; 1308 | }; 1309 | A9454C0C22BE1EC600055860 /* Build configuration list for PBXNativeTarget "BTTTouchBarPluginSampleCustomString" */ = { 1310 | isa = XCConfigurationList; 1311 | buildConfigurations = ( 1312 | A9454C0D22BE1EC600055860 /* Debug */, 1313 | A9454C0E22BE1EC600055860 /* Release */, 1314 | ); 1315 | defaultConfigurationIsVisible = 0; 1316 | defaultConfigurationName = Release; 1317 | }; 1318 | A9454C6122BE69BA00055860 /* Build configuration list for PBXNativeTarget "BTTPluginSupport" */ = { 1319 | isa = XCConfigurationList; 1320 | buildConfigurations = ( 1321 | A9454C6222BE69BA00055860 /* Debug */, 1322 | A9454C6322BE69BA00055860 /* Release */, 1323 | ); 1324 | defaultConfigurationIsVisible = 0; 1325 | defaultConfigurationName = Release; 1326 | }; 1327 | A9DC034823D4AEB900C0E704 /* Build configuration list for PBXNativeTarget "BTTDisplayNotificationActionPlugin" */ = { 1328 | isa = XCConfigurationList; 1329 | buildConfigurations = ( 1330 | A9DC034923D4AEB900C0E704 /* Debug */, 1331 | A9DC034A23D4AEB900C0E704 /* Release */, 1332 | ); 1333 | defaultConfigurationIsVisible = 0; 1334 | defaultConfigurationName = Release; 1335 | }; 1336 | A9ED79FE2877753800B95821 /* Build configuration list for PBXNativeTarget "BTTStreamDeckPluginCPUUsage" */ = { 1337 | isa = XCConfigurationList; 1338 | buildConfigurations = ( 1339 | A9ED79FF2877753800B95821 /* Debug */, 1340 | A9ED7A002877753800B95821 /* Release */, 1341 | ); 1342 | defaultConfigurationIsVisible = 0; 1343 | defaultConfigurationName = Release; 1344 | }; 1345 | /* End XCConfigurationList section */ 1346 | }; 1347 | rootObject = A9454BB622BE1E3300055860 /* Project object */; 1348 | } 1349 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment.xcodeproj/project.xcworkspace/xcuserdata/andi.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/BetterTouchToolPluginDevelopment.xcodeproj/project.xcworkspace/xcuserdata/andi.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment.xcodeproj/xcshareddata/xcschemes/BTTStreamDeckPluginCPUUsage.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 57 | 58 | 59 | 60 | 62 | 63 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment.xcodeproj/xcuserdata/andi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 22 | 23 | 24 | 26 | 39 | 40 | 41 | 43 | 56 | 57 | 58 | 60 | 73 | 74 | 75 | 77 | 90 | 91 | 92 | 94 | 106 | 107 | 108 | 110 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment.xcodeproj/xcuserdata/andi.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | BTTDisplayNotificationActionPlugin.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 6 11 | 12 | BTTPluginSupport.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 3 16 | 17 | BTTStreamDeckPluginCPUUsage.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 0 21 | 22 | BTTTouchBarPluginSampleCustomString.xcscheme_^#shared#^_ 23 | 24 | orderHint 25 | 4 26 | 27 | BTTTouchBarPluginSampleCustomView.xcscheme_^#shared#^_ 28 | 29 | orderHint 30 | 2 31 | 32 | BTTTouchBarSampleCustomButton.xcscheme_^#shared#^_ 33 | 34 | orderHint 35 | 5 36 | 37 | BetterTouchToolPluginDevelopment.xcscheme_^#shared#^_ 38 | 39 | orderHint 40 | 1 41 | 42 | 43 | SuppressBuildableAutocreation 44 | 45 | A9ED79F42877753800B95821 46 | 47 | primary 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : NSObject 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 18 | // Insert code here to initialize your application 19 | 20 | } 21 | 22 | 23 | - (void)applicationWillTerminate:(NSNotification *)aNotification { 24 | // Insert code here to tear down your application 25 | } 26 | 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/BTTPluginInterface.h: -------------------------------------------------------------------------------- 1 | // 2 | // BTTPluginInterface.h 3 | // BetterTouchTool 4 | // 5 | // Created by Andreas Hegenberg on 20.06.19. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | @class BTTPluginFormItem; 12 | 13 | 14 | @protocol BTTStreamDeckPluginDelegate 15 | 16 | // This allows to trigger a named trigger which the user has configured in BTT 17 | -(void)executeNamedTrigger:(NSString* _Nonnull)triggerName withReply:(void (^_Nullable)(id _Nullable ))reply; 18 | 19 | // This allows to trigger any of BTT's script commands see http://docs.folivora.ai/docs/1102_apple_script.html 20 | -(id _Nullable )executeScriptCommand:(NSString* _Nonnull)command withParameters:(NSDictionary* _Nullable)args asyncReply:(void (^_Nullable)(id _Nullable))asyncReply; 21 | 22 | // This will execute the actions the user has assigned to your plugin. 23 | -(void)executeAssignedBTTActions:(id _Nonnull )sender; 24 | 25 | -(void)requestUpdate:(id _Nonnull )sender; 26 | @end 27 | 28 | 29 | @protocol BTTStreamDeckPluginInterface 30 | 31 | 32 | @optional 33 | 34 | // the delegate will be set automatically after this plugin is loaded in BTT 35 | @property (nullable, weak) id delegate; 36 | 37 | //MARK: Side-Bar configuration: 38 | // here you can configure and return the form items are shown in the BTT configuration side-bar for this plugin 39 | +(BTTPluginFormItem* _Nullable)configurationFormItems; 40 | 41 | // This defines whether the appearance tab will be shown when configuring this plugin 42 | +(BOOL)showAppearanceTab; 43 | // This defines whether the alternate appearance tab will be shown when configuring this plugin 44 | +(BOOL)showAlternateAppearanceTab; 45 | 46 | // Return a dictionary with default configuation items here. 47 | // (the ones you get when copying a trigger in BTT and looking at the BTTTriggerConfig object) 48 | +(NSDictionary* _Nullable)defaultConfiguration; 49 | 50 | /* 51 | * NOTE: NOT YET SUPPORTED 52 | * 53 | * This defines whether the buttons of this widget will be put into a group. 54 | * If you activate this,the first item in the arrays below always needs to be the 55 | * group item. 56 | */ 57 | +(BOOL)groupWidgetButtons; 58 | 59 | 60 | // MARK: RENDERING the Buttons 61 | 62 | /* 63 | * If this returns true, BTT will attempt to render with alternate appearance 64 | */ 65 | -(BOOL)alternateModeActive; 66 | 67 | /* 68 | * NOTE: while all the following methods return arrays, 69 | * currently only the first item in the array is being used. 70 | * 71 | * You need to implement one of the 72 | * following 4 methods. If you implement 73 | * multiple, BTT will only execute the first, 74 | * trying in this order: 75 | */ 76 | 77 | /* MARK: Option 1: Returning an Array of Strings 78 | * If you return an array of strings here, it will render one button 79 | * per string applying the appearance settings defined in BetterTouchTool. 80 | * This means all standard properties like background color 81 | * will be applied. 82 | */ 83 | -(NSArray* _Nullable)widgetTitleStrings; 84 | 85 | /* MARK: Option 2: Returning an Array of Attributed Strings 86 | * If you return an array of attributed strings, BTT will render buttons 87 | * based on these but also apply additional styling as configured by the user 88 | * (e.g. background color) 89 | */ 90 | -(NSArray* _Nullable)widgetAttributedTitleStrings; 91 | 92 | /* MARK: Option 3: Returning an Array of Dictionaries with the rendering description 93 | * You can return an array of dictionaries with the following keys. They might be mutually exclusive: 94 | * { 95 | "BTTStreamDeckBackgroundColor" : "80.954640, 96.000000, 94.000000, 255.000000", 96 | "BTTStreamDeckCornerRadius" : 13, 97 | "BTTStreamDeckImageReal": a real NSImage instance 98 | "BTTStreamDeckImage" : "base64imagesstring", 99 | "BTTStreamDeckImageOffsetY" : 2, 100 | "BTTStreamDeckImageOffsetX" : 2 101 | "BTTStreamDeckImageChangeColor" : 1, 102 | "BTTStreamDeckResizeImage" : 2, 103 | "BTTStreamDeckImageHeight" : 30, 104 | "BTTStreamDeckImageWidth" : 30, 105 | "BTTStreamDeckSFSymbolStyle" : 3, 106 | "BTTStreamDeckSFSymbolName" : "square.and.arrow.up.circle.fill", 107 | "BTTStreamDeckIconType" : 1, 108 | "BTTStreamDeckAlternateImageHeight" : 50, 109 | "BTTStreamDeckIconColor1" : "255.000000, 74.896763, 114.000000, 255.000000", 110 | "BTTStreamDeckIconColor2" : "255, 255, 255, 255", 111 | "BTTStreamDeckIconColor3" : "255, 255, 255, 255", 112 | "BTTStreamDeckAttributedTitleReal": a real NSAttributedString instance 113 | "BTTStreamDeckAttributedTitle" : "cnRmZAAAAAADAAAAAgAAAAcAAABUWFQucnRmAQAAAC6BAQAAKwAAAAEAAAB5AQAAe1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcY29jb2FydGYyNjM4Clxjb2NvYXRleHRzY2FsaW5nMFxjb2NvYXBsYXRmb3JtMHtcZm9udHRibFxmMFxmbmlsXGZjaGFyc2V0MCBTRlByby1SZWd1bGFyO30Ke1xjb2xvcnRibDtccmVkMjU1XGdyZWVuMjU1XGJsdWUyNTU7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O30Ke1wqXGV4cGFuZGVkY29sb3J0Ymw7O1xjc3NyZ2JcYzEwMDAwMFxjMTAwMDAwXGMxMDAwMDA7fQpccGFyZFx0eDU2MFx0eDExMjBcdHgxNjgwXHR4MjI0MFx0eDI4MDBcdHgzMzYwXHR4MzkyMFx0eDQ0ODBcdHg1MDQwXHR4NTYwMFx0eDYxNjBcdHg2NzIwXHBhcmRpcm5hdHVyYWxccWNccGFydGlnaHRlbmZhY3RvcjAKClxmMFxmczUwIFxjZjIgdGVzdH0BAAAAIwAAAAEAAAAHAAAAVFhULnJ0ZhAAAABk2cZitgEAAAAAAAAAAAAA", 114 | 115 | } 116 | * The individual widget buttons will be rendered based on these descriptions. 117 | */ 118 | -(NSArray* _Nullable)widgetDictionaries; 119 | 120 | 121 | /* MARK: Option 4: Returning an Array of rendered Images 122 | * You can also just return an array of rendered images. 123 | * The images should be sized at around 140x140 (BTT will resize it to fit for any device) 124 | */ 125 | -(NSArray* _Nullable)widgetImages; 126 | 127 | // this will give you the current configuration values for your widget 128 | // (as defined in the form you returned via configurationFormItems) 129 | -(void)didReceiveNewConfigurationValues:(NSDictionary* _Nonnull)configurationValues; 130 | 131 | 132 | // If you return more than one button you need to return an array of 133 | // strings that identify the buttons in the same order as returned from 134 | // widgetTitleStrings, widgetAttributedTitleStrings, widgetDictionaries or 135 | // widgetImages 136 | -(NSArray* _Nullable)buttonIdentifiers; 137 | 138 | // called when the user presses the button down. 139 | // return true to cancel assigned BTT actions. 140 | -(BOOL)buttonDown:( NSString* _Nullable )identifier; 141 | 142 | // called when the user releases the button 143 | // return true to cancel assigned BTT actions. 144 | -(BOOL)buttonUp:(NSInteger)identifier; 145 | @end 146 | 147 | 148 | 149 | @protocol BTTTouchBarPluginDelegate 150 | 151 | -(void)executeAssignedBTTActions:(id _Nonnull )sender; 152 | -(void)updateWithString:(NSString*_Nonnull)string sender:(id _Nonnull )sender; 153 | 154 | @end 155 | 156 | 157 | @protocol BTTPluginInterface 158 | 159 | 160 | @optional 161 | 162 | // the delegate will be set automatically after this plugin is loaded in BTT 163 | @property (nullable, weak) id delegate; 164 | 165 | //MARK: Side-Bar configuration: 166 | // here you can configure what items are shown in the BTT configuration side-bar for this plugin 167 | +(BTTPluginFormItem* _Nullable)configurationFormItems; 168 | 169 | 170 | /* 171 | * You need to implement one of the 172 | * following 3 methods. If you implement 173 | * multiple, BTT will only execute the first, 174 | * trying in this order: 175 | */ 176 | 177 | /* MARK: Option 1: Returning a String 178 | * If you return a string here, it will be rendered on the 179 | * Touch Bar using the standard BetterTouchTool render widget. 180 | * This means all standard properties like background color 181 | * will be applied. 182 | */ 183 | -(NSString* _Nullable)touchBarTitleString; 184 | 185 | /* MARK: Option 2: Returning a NSButton instance 186 | * if you return a button, BTT will just display that 187 | * button on the Touch Bar. 188 | * You are responsible for any styling you want to apply. 189 | * Make sure to always return the same instance of the button 190 | * here. 191 | */ 192 | -(NSButton* _Nullable)touchBarButton; 193 | 194 | /* MARK: Option 3: Returning a NSViewController instance 195 | * if you return a view controller BTT will display the view 196 | * controller's view on 197 | * the Touch Bar. 198 | * You are responsible for any styling you want to apply. 199 | * Make sure to always return the same instance of the button 200 | * here. 201 | */ 202 | -(NSViewController* _Nullable)touchBarViewController; 203 | 204 | 205 | 206 | // here you can configure what items are shown in the BTT configuration side-bar for this plugin 207 | -(void)didReceiveNewConfigurationValues:(NSDictionary* _Nonnull)configurationValues; 208 | 209 | 210 | @end 211 | 212 | @protocol BTTActionPluginDelegate 213 | 214 | // doesn't have any functionality yet 215 | 216 | @end 217 | 218 | 219 | @protocol BTTActionPluginInterface 220 | 221 | 222 | //MARK: Side-Bar configuration: 223 | // here you can configure what items are shown in the BTT configuration side-bar for this plugin 224 | +(BTTPluginFormItem* _Nullable)configurationFormItems; 225 | 226 | // MARK: Execute this action 227 | // This will be called if the user has triggered the action through some trigger in BTT. 228 | -(void)executeActionWithConfiguration:(NSDictionary* _Nullable)configurationValues completionBlock:(void (^_Nullable)(_Nullable id))actionExecutedWithResult; 229 | 230 | @optional 231 | // by default the action name is specified in the info.plist, in case you want 232 | // to display additional dynamic names, you can generate them here. 233 | +(NSString* _Nullable)actionNameWithConfiguration:(NSDictionary* _Nullable)configurationValues; 234 | // the delegate will be set automatically after this plugin is loaded in BTT 235 | @property (nullable, weak) id delegate; 236 | 237 | 238 | @end 239 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/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 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | Default 531 | 532 | 533 | 534 | 535 | 536 | 537 | Left to Right 538 | 539 | 540 | 541 | 542 | 543 | 544 | Right to Left 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | Default 556 | 557 | 558 | 559 | 560 | 561 | 562 | Left to Right 563 | 564 | 565 | 566 | 567 | 568 | 569 | Right to Left 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 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | This will render the views defined by the different BetterTouchTool Touch Bar plugins in this project (will be rendered on your Touch Bar!). 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/BetterTouchToolPluginDevelopment.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/DemoTouchBarViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DemoTouchBarViewController.h 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface DemoTouchBarViewController : NSViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/DemoTouchBarViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DemoTouchBarViewController.m 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import "DemoTouchBarViewController.h" 10 | 11 | @interface DemoTouchBarViewController () 12 | 13 | @end 14 | 15 | @implementation DemoTouchBarViewController 16 | 17 | -(void)loadView { 18 | self.view = [[NSView alloc] initWithFrame:NSZeroRect]; 19 | } 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | // Do view setup here. 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | Copyright © 2019 Andreas Hegenberg. All rights reserved. 27 | NSMainStoryboardFile 28 | Main 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : NSViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController() { 12 | 13 | } 14 | 15 | 16 | @end 17 | 18 | @implementation ViewController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | 23 | } 24 | 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/WindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // WindowController.h 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DemoTouchBarViewController.h" 11 | #import "BTTPluginInterface.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface WindowController : NSWindowController 16 | 17 | @property (nonatomic, strong) NSTouchBar *touchBar; 18 | @property (nonatomic, strong) NSCustomTouchBarItem* customItem; 19 | @property (nonatomic, strong) DemoTouchBarViewController *touchBarViewController; 20 | @property (nonatomic, copy) NSString *tbIdentifier; 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/WindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // WindowController.m 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import "WindowController.h" 10 | 11 | @interface WindowController () 12 | 13 | @end 14 | 15 | @implementation WindowController 16 | 17 | - (void)windowDidLoad { 18 | [super windowDidLoad]; 19 | // [self loadDevPluginBundles]; 20 | [self makeTouchBar]; 21 | // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. 22 | [self loadDevPluginBundles]; 23 | } 24 | 25 | 26 | -(NSTouchBar*)makeTouchBar { 27 | self.tbIdentifier = @"BTTPluginDevTB"; 28 | self.touchBarViewController = [[DemoTouchBarViewController alloc] init]; 29 | NSTouchBar* bar = [[NSTouchBar alloc] init]; 30 | bar.delegate = self; 31 | bar.defaultItemIdentifiers = @[ self.tbIdentifier ]; 32 | self.touchBar = bar; 33 | 34 | return bar; 35 | } 36 | 37 | - (nullable NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier 38 | { 39 | 40 | if (!self.customItem) { 41 | self.customItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:self.tbIdentifier]; 42 | 43 | self.customItem.viewController = self.touchBarViewController; 44 | self.customItem.customizationLabel = @""; 45 | } 46 | 47 | return self.customItem; 48 | } 49 | 50 | -(void)loadDevPluginBundles { 51 | NSURL *appURL = [[[NSBundle mainBundle] bundleURL] URLByDeletingLastPathComponent]; 52 | 53 | NSFileManager *fileManager = [NSFileManager defaultManager]; 54 | NSDirectoryEnumerator* enumerator = [fileManager enumeratorAtURL:appURL includingPropertiesForKeys:nil options:0 errorHandler:^BOOL(NSURL * _Nonnull url, NSError * _Nonnull error) { 55 | NSLog(@"error %@", error); 56 | return NO; 57 | }]; 58 | 59 | NSURL *file; 60 | CGFloat lastX = 0; 61 | while (file = [enumerator nextObject]) { 62 | 63 | if([file.pathExtension containsString:@"bttstreamdeckplugin"] || [file.pathExtension containsString:@"bttsdplugin"]) { 64 | 65 | NSBundle *bundle = [NSBundle bundleWithURL:file]; 66 | 67 | NSDictionary *infoDictionary = [bundle infoDictionary]; 68 | NSString *pluginName = [infoDictionary objectForKey:@"BTTPluginName"]; 69 | NSString *pluginIdentifier = [infoDictionary objectForKey:@"BTTPluginIdentifier"]; 70 | NSString *imageName = [infoDictionary objectForKey:@"BTTPluginIcon"]; 71 | ; 72 | NSImage *pluginIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:imageName ofType:@"tiff"]] ; 73 | 74 | 75 | 76 | NSLog(@"found streamdeck plugin %@ | %@ | icon %@ - loaded: %@", pluginName, pluginIdentifier, imageName, pluginIcon ? @"YES" : @"NO"); 77 | 78 | id pluginInstance = [[[bundle principalClass] alloc] init]; 79 | 80 | } else if([file.pathExtension containsString:@"btttouchbarplugin"]) { 81 | 82 | NSBundle *bundle = [NSBundle bundleWithURL:file]; 83 | 84 | NSDictionary *infoDictionary = [bundle infoDictionary]; 85 | NSString *pluginName = [infoDictionary objectForKey:@"BTTPluginName"]; 86 | NSString *pluginIdentifier = [infoDictionary objectForKey:@"BTTPluginIdentifier"]; 87 | NSString *imageName = [infoDictionary objectForKey:@"BTTPluginIcon"]; 88 | ; 89 | NSImage *pluginIcon = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:imageName ofType:@"tiff"]] ; 90 | 91 | 92 | 93 | NSLog(@"found touchbar plugin %@ | %@ | icon %@ - loaded: %@", pluginName, pluginIdentifier, imageName, pluginIcon ? @"YES" : @"NO"); 94 | 95 | NSView *touchbarView = nil; 96 | id pluginInstance = [[[bundle principalClass] alloc] init]; 97 | 98 | if([pluginInstance respondsToSelector:@selector(touchBarTitleString)]) { 99 | NSString *title = [pluginInstance touchBarTitleString]; 100 | touchbarView = [NSButton buttonWithTitle:title target:nil action: nil]; 101 | } 102 | if([pluginInstance respondsToSelector:@selector(touchBarButton)]) { 103 | touchbarView = [pluginInstance touchBarButton]; 104 | } 105 | if(!touchbarView) { 106 | if([pluginInstance respondsToSelector:@selector(touchBarViewController)]) { 107 | touchbarView = [pluginInstance touchBarViewController].view; 108 | } 109 | } 110 | 111 | if(touchbarView) { 112 | NSRect frame = touchbarView.frame; 113 | frame.origin.x += lastX+5; 114 | touchbarView.frame = frame; 115 | [self.touchBarViewController.view addSubview:touchbarView]; 116 | lastX += touchbarView.frame.origin.x + touchbarView.frame.size.width; 117 | } 118 | } 119 | } 120 | 121 | } 122 | 123 | 124 | 125 | @end 126 | -------------------------------------------------------------------------------- /BetterTouchToolPluginDevelopment/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // BetterTouchToolPluginDevelopment 4 | // 5 | // Created by Andreas Hegenberg on 22.06.19. 6 | // Copyright © 2019 Andreas Hegenberg. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 folivora.AI GmbH 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BetterTouchTool Plugins 2 | 3 | This repository will contain examples on how to create BetterTouchTool plugins. 4 | Starting with version 3.818 BetterTouchTool supports Touch Bar, Stream Deck and Action plugins. 5 | 6 | Plugins are installed at this location: /Library/Application Support/BetterTouchTool/Plugins 7 | 8 | ## Stream Deck Plugins 9 | Currently there are three types of Stream Deck plugins: 10 | Plugins that 11 | * return an array of strings which will be rendered using the appearance settings configured by the user in BetterTouchTool 12 | * return an array of attributed strings which will be rendered 13 | * return an array of dictionaries that describe what shall be rendered 14 | * return an array of ready rendered nsimages 15 | 16 | The CPU Usage example in this repo uses the first option and just returns a simple string, which is then rendered in BTT. 17 | 18 | ## Touch Bar Plugins 19 | 20 | Currently there are three types of Touch Bar plugins: 21 | Plugins that 22 | * return a string which will be rendered using a BTT Touch Bar button that is fully customizable using the standard BTT mechanisms 23 | * returning a custom NSButton instance that you can style and modify 24 | * returning a custom NSViewController instance with a custom view attached to it. 25 | 26 | This repository contains basic example plugins for all three of these types. 27 | 28 | 29 | 30 | ## Touch Bar Plugin Requirements 31 | 32 | A BetterTouchTool Touch Bar plugin must fulfil these requirements: 33 | * its wrapper extension must be ".btttouchbarplugin" 34 | * its info.plist must contain these three keys: BTTPluginName, BTTPluginIdentifier, BTTPluginIcon 35 | * it must conform to the BTTTouchBarPluginInterface protocol (https://github.com/folivoraAI/BetterTouchToolPlugins/blob/master/BetterTouchToolPluginDevelopment/BTTPluginInterface.h ) 36 | * it must link against the BTTPluginSupport.framework 37 | * the principal class in the info.plist must be set to the main class that conforms to the BTTTouchBarPluginInterface protocol. 38 | * When using Swift to develop the plugins, make sure to set the principal class to the fully qualified name (PluginName.PluginPrincipalClass). 39 | 40 | Please see the example plugins for details! 41 | 42 | ## Action Plugin Development 43 | 44 | Starting with BTT 3.226 action plugins are supported. They allow you to extend the list of available predefined ations with your own custom ones. 45 | 46 | It's easy to create such an action extension: 47 | * its wrapper extension must be ".bttactionplugin" 48 | * its info.plist must contain these three keys: BTTPluginName, BTTPluginIdentifier, BTTPluginIcon, and BTTPluginType which must be set to "Action" 49 | * it must conform to the BTTActionPluginInterface protocol (https://github.com/folivoraAI/BetterTouchToolPlugins/blob/master/BetterTouchToolPluginDevelopment/BTTPluginInterface.h ) 50 | * it must link against the BTTPluginSupport.framework 51 | * the principal class in the info.plist must be set to the main class that conforms to the BTTActionPluginInterface protocol. 52 | * When using Swift to develop the plugins, make sure to set the principal class to the fully qualified name ($(PRODUCT_MODULE_NAME).PluginPrincipalClass). 53 | 54 | There is a example action extension included in this project (BTTDisplayNotificationActionPlugin), it shows the basic concepts and can be used as a starting point. 55 | 56 | ## Get Started 57 | 58 | 1. Clone this project (```git clone git@github.com:folivoraAI/BetterTouchToolPlugins.git```) 59 | 2. Open the project in Xcode 60 | 3. Run the project. 61 | 4. Running it will open a simple sample application that loads the three sample plugins and renders them to the Touch Bar - however it does not offer the customization options BTT offers. 62 | To see the plugin bundles, select the "Products" group in the XCode side-bar - you can then right-click them and select "Show in Finder". 63 | 64 | ## Installing Plugins into BTT 65 | 66 | You can install the plugins into BTT by double-clicking them or by copying them to ~/Library/Application Support/BetterTouchTool/Plugins 67 | You can configure these plugins in BetterTouchTool - they will be listed under "Touch Bar Plugins" in the Touch Bar widget selector popover. Action plugins will appear in the standard action selector popup. 68 | 69 | ## Distributing Plugins 70 | 71 | If you want to distribute plugins to other users, you must notarize them - otherwise they will not run. You need an Apple developer account to do this. 72 | Here a full build & notarize example. If you have any questions: andreas@folivora.ai 73 | 74 | ### 1 Build/Archive 75 | xcodebuild archive -scheme BTTStreamDeckPluginCPUUsage -configuration Release -archivePath ./build/streamdeckcpuusage.xcarchive 76 | cd build/streamdeckcpuusage.xcarchive/Products/Library/Bundles/ 77 | 78 | ### 2 Code Sign with Developer ID Application (replace with your IDs) 79 | codesign --deep -s "Developer ID Application: folivora.AI GmbH (DAFVSXZ82P)" -f BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin 80 | 81 | ### 3 Zip Up For Notarization 82 | ditto -c -k --keepParent --rsrc BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin.notarize.zip 83 | 84 | ### 4 Send for Notarization (this references an application specific password for my Apple Account from the keychain) 85 | xcrun altool --notarize-app --primary-bundle-id "com.folivora.sd.cpuusage" --username "your.developer.account.email@gmail.com" --password "@keychain:notarization" --file BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin.notarize.zip 86 | 87 | ### 5 Staple Notarization Info 88 | xcrun stapler staple BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin 89 | 90 | 91 | ### 6 Zip for Shipping to Others 92 | ditto -c -k --keepParent --rsrc BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin BTTStreamDeckPluginCPUUsage.bttstreamdeckplugin.zip 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /x.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/folivoraAI/BetterTouchToolPlugins/26b4ecc7964cc2c515cb0981c2a4dc0649d1e65d/x.txt --------------------------------------------------------------------------------