├── .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 |
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
--------------------------------------------------------------------------------