├── .gitignore
├── LICENSE
├── README.md
├── Resources
├── menu_item.ai
├── preferences.png
├── xcmonitor_demo.gif
├── xcmonitor_history.png
├── xcmonitor_icon.png
├── xcmonitor_icon.psd
└── xcode_status.ai
├── XCMonitor.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
└── xcshareddata
│ └── xcschemes
│ └── XCMonitor.xcscheme
├── XCMonitor
├── Assets.xcassets
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── icon_128x128.png
│ │ ├── icon_128x128@2x.png
│ │ ├── icon_16x16.png
│ │ ├── icon_16x16@2x.png
│ │ ├── icon_256x256.png
│ │ ├── icon_256x256@2x.png
│ │ ├── icon_32x32.png
│ │ ├── icon_32x32@2x.png
│ │ ├── icon_512x512.png
│ │ └── icon_512x512@2x.png
│ ├── Contents.json
│ ├── General.imageset
│ │ ├── Contents.json
│ │ ├── general.png
│ │ └── general@2x.png
│ ├── MenuBar
│ │ ├── Contents.json
│ │ ├── build-fails-dark.imageset
│ │ │ ├── Contents.json
│ │ │ ├── build_fails.png
│ │ │ └── build_fails@2x.png
│ │ ├── build-fails-light.imageset
│ │ │ ├── Contents.json
│ │ │ ├── build_fails.png
│ │ │ └── build_fails@2x.png
│ │ ├── build-start-dark.imageset
│ │ │ ├── Contents.json
│ │ │ ├── build_start.png
│ │ │ └── build_start@2x.png
│ │ ├── build-start-light.imageset
│ │ │ ├── Contents.json
│ │ │ ├── build_start.png
│ │ │ └── build_start@2x.png
│ │ ├── build-succeeds-dark.imageset
│ │ │ ├── Contents.json
│ │ │ ├── build_succeeds.png
│ │ │ └── build_succeeds@2x.png
│ │ ├── build-succeeds-light.imageset
│ │ │ ├── Contents.json
│ │ │ ├── build_succeeds.png
│ │ │ └── build_succeeds@2x.png
│ │ ├── standby-dark.imageset
│ │ │ ├── Contents.json
│ │ │ ├── standby.png
│ │ │ └── standby@2x.png
│ │ ├── standby-light.imageset
│ │ │ ├── Contents.json
│ │ │ ├── standby.png
│ │ │ └── standby@2x.png
│ │ ├── testing-fails-dark.imageset
│ │ │ ├── Contents.json
│ │ │ ├── testing_fails.png
│ │ │ └── testing_fails@2x.png
│ │ ├── testing-fails-light.imageset
│ │ │ ├── Contents.json
│ │ │ ├── testing_fails.png
│ │ │ └── testing_fails@2x.png
│ │ ├── testing-start-dark.imageset
│ │ │ ├── Contents.json
│ │ │ ├── testing_start.png
│ │ │ └── testing_start@2x.png
│ │ ├── testing-start-light.imageset
│ │ │ ├── Contents.json
│ │ │ ├── testing_start.png
│ │ │ └── testing_start@2x.png
│ │ ├── testing-succeeds-dark.imageset
│ │ │ ├── Contents.json
│ │ │ ├── testing_succeeds.png
│ │ │ └── testing_succeeds@2x.png
│ │ └── testing-succeeds-light.imageset
│ │ │ ├── Contents.json
│ │ │ ├── testing_succeeds.png
│ │ │ └── testing_succeeds@2x.png
│ └── MenuItem
│ │ ├── Contents.json
│ │ ├── build-failed.imageset
│ │ ├── Contents.json
│ │ ├── build-failed.png
│ │ └── build-failed@2x.png
│ │ ├── build-succeeded.imageset
│ │ ├── Contents.json
│ │ ├── build-succeeded.png
│ │ └── build-succeeded@2x.png
│ │ ├── test-failed.imageset
│ │ ├── Contents.json
│ │ ├── test-failed.png
│ │ └── test-failed@2x.png
│ │ └── test-succeeded.imageset
│ │ ├── Contents.json
│ │ ├── test-succeeded.png
│ │ └── test-succeeded@2x.png
├── Info.plist
├── Model
│ ├── AppDelegate.swift
│ └── EventHistory.swift
├── View
│ ├── Extensions.swift
│ ├── GeneralSettingsView.swift
│ ├── HistoryMenuItem.swift
│ ├── MenuBar.swift
│ └── SettingsView.swift
├── ViewModel
│ ├── GeneralSettingsViewModel.swift
│ └── MenuBarModel.swift
├── XCMonitor.entitlements
├── XCMonitorApp.swift
├── en.lproj
│ └── Localizable.strings
└── ja.lproj
│ └── Localizable.strings
└── XCMonitorLauncher
├── AppDelegate.swift
├── Info.plist
├── XCMonitorLauncher.entitlements
└── main.swift
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | original/
3 |
4 | # Xcode
5 | xcuserdata/
6 | *.xcuserstate
7 |
8 | # Swift Package Manager
9 | Packages
10 | Packages.resolved
11 | .swiftpm/
12 | .build/
13 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Takuto NAKAMURA (Kyome)
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 | # XCMonitor
2 |
3 |
4 |
5 | A simple tool to monitor Xcode events (building and testing).
6 |
7 |
8 |
9 | ## Logging event history
10 |
11 | This app can collect Xcode event types and elapsed time.
12 |
13 |
14 |
15 | ## Installation
16 |
17 | Go to [Releases](https://github.com/Kyome22/XCMonitor/releases) and download the latest `dmg` file.
18 |
19 | ## How to activate
20 |
21 | Open Preferences of XCMonitor and enable XCHook.
22 |
23 |
24 |
25 | ## XCHook
26 |
27 | A library to hack the events (building and testing) of Xcode.app.
28 | This library supports macOS (11+).
29 | XCMonitor is a demonstration for XCHook.
30 |
31 | https://github.com/Kyome22/XCHook
32 |
--------------------------------------------------------------------------------
/Resources/menu_item.ai:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/Resources/menu_item.ai
--------------------------------------------------------------------------------
/Resources/preferences.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/Resources/preferences.png
--------------------------------------------------------------------------------
/Resources/xcmonitor_demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/Resources/xcmonitor_demo.gif
--------------------------------------------------------------------------------
/Resources/xcmonitor_history.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/Resources/xcmonitor_history.png
--------------------------------------------------------------------------------
/Resources/xcmonitor_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/Resources/xcmonitor_icon.png
--------------------------------------------------------------------------------
/Resources/xcmonitor_icon.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/Resources/xcmonitor_icon.psd
--------------------------------------------------------------------------------
/Resources/xcode_status.ai:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/Resources/xcode_status.ai
--------------------------------------------------------------------------------
/XCMonitor.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 55;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1C27E6ED284E586600AB7911 /* EventHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C27E6EC284E586600AB7911 /* EventHistory.swift */; };
11 | 1C58AFF6281D8AE70022595E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C58AFF5281D8AE70022595E /* AppDelegate.swift */; };
12 | 1C58AFFA281D8AE80022595E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1C58AFF9281D8AE80022595E /* Assets.xcassets */; };
13 | 1C58B00D281D8DAB0022595E /* MenuBarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C58B00C281D8DAB0022595E /* MenuBarModel.swift */; };
14 | 1C58B00F281D8DF90022595E /* MenuBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C58B00E281D8DF90022595E /* MenuBar.swift */; };
15 | 1C58B011281D8E380022595E /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C58B010281D8E380022595E /* Extensions.swift */; };
16 | 1C58B020281EDDCF0022595E /* GeneralSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C58B01F281EDDCF0022595E /* GeneralSettingsViewModel.swift */; };
17 | 1C58B023281EE02D0022595E /* XCHook in Frameworks */ = {isa = PBXBuildFile; productRef = 1C58B022281EE02D0022595E /* XCHook */; };
18 | 1C5BEE6D283E91B000AC339D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5BEE6C283E91B000AC339D /* AppDelegate.swift */; };
19 | 1C5BEE7B283E924500AC339D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C5BEE7A283E924500AC339D /* main.swift */; };
20 | 1C5BEE7D283E92FD00AC339D /* XCMonitorLauncher.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1C5BEE6A283E91B000AC339D /* XCMonitorLauncher.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
21 | 1CB48B5A2858E8DD0024FF45 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1CB48B5C2858E8DD0024FF45 /* Localizable.strings */; };
22 | 1CE1994328548E590040CE90 /* HistoryMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CE1994228548E590040CE90 /* HistoryMenuItem.swift */; };
23 | 1CE199642854D9D00040CE90 /* XCMonitorApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CE199632854D9D00040CE90 /* XCMonitorApp.swift */; };
24 | 1CE199662854DB580040CE90 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CE199652854DB580040CE90 /* SettingsView.swift */; };
25 | 1CE199682854DB910040CE90 /* GeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CE199672854DB910040CE90 /* GeneralSettingsView.swift */; };
26 | /* End PBXBuildFile section */
27 |
28 | /* Begin PBXCopyFilesBuildPhase section */
29 | 1C5BEE7C283E92D400AC339D /* CopyFiles */ = {
30 | isa = PBXCopyFilesBuildPhase;
31 | buildActionMask = 2147483647;
32 | dstPath = Contents/Library/LoginItems;
33 | dstSubfolderSpec = 1;
34 | files = (
35 | 1C5BEE7D283E92FD00AC339D /* XCMonitorLauncher.app in CopyFiles */,
36 | );
37 | runOnlyForDeploymentPostprocessing = 0;
38 | };
39 | /* End PBXCopyFilesBuildPhase section */
40 |
41 | /* Begin PBXFileReference section */
42 | 1C27E6EC284E586600AB7911 /* EventHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventHistory.swift; sourceTree = ""; };
43 | 1C58AFF2281D8AE70022595E /* XCMonitor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XCMonitor.app; sourceTree = BUILT_PRODUCTS_DIR; };
44 | 1C58AFF5281D8AE70022595E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
45 | 1C58AFF9281D8AE80022595E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
46 | 1C58AFFE281D8AE80022595E /* XCMonitor.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCMonitor.entitlements; sourceTree = ""; };
47 | 1C58B007281D8C290022595E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; };
48 | 1C58B00C281D8DAB0022595E /* MenuBarModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBarModel.swift; sourceTree = ""; };
49 | 1C58B00E281D8DF90022595E /* MenuBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBar.swift; sourceTree = ""; };
50 | 1C58B010281D8E380022595E /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; };
51 | 1C58B01F281EDDCF0022595E /* GeneralSettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsViewModel.swift; sourceTree = ""; };
52 | 1C5BEE6A283E91B000AC339D /* XCMonitorLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XCMonitorLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; };
53 | 1C5BEE6C283E91B000AC339D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
54 | 1C5BEE75283E91B100AC339D /* XCMonitorLauncher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = XCMonitorLauncher.entitlements; sourceTree = ""; };
55 | 1C5BEE79283E91F800AC339D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; };
56 | 1C5BEE7A283E924500AC339D /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; };
57 | 1CB48B5B2858E8DD0024FF45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
58 | 1CB48B5D2858E8E10024FF45 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
59 | 1CE1994228548E590040CE90 /* HistoryMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryMenuItem.swift; sourceTree = ""; };
60 | 1CE199632854D9D00040CE90 /* XCMonitorApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCMonitorApp.swift; sourceTree = ""; };
61 | 1CE199652854DB580040CE90 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; };
62 | 1CE199672854DB910040CE90 /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = ""; };
63 | /* End PBXFileReference section */
64 |
65 | /* Begin PBXFrameworksBuildPhase section */
66 | 1C58AFEF281D8AE70022595E /* Frameworks */ = {
67 | isa = PBXFrameworksBuildPhase;
68 | buildActionMask = 2147483647;
69 | files = (
70 | 1C58B023281EE02D0022595E /* XCHook in Frameworks */,
71 | );
72 | runOnlyForDeploymentPostprocessing = 0;
73 | };
74 | 1C5BEE67283E91B000AC339D /* Frameworks */ = {
75 | isa = PBXFrameworksBuildPhase;
76 | buildActionMask = 2147483647;
77 | files = (
78 | );
79 | runOnlyForDeploymentPostprocessing = 0;
80 | };
81 | /* End PBXFrameworksBuildPhase section */
82 |
83 | /* Begin PBXGroup section */
84 | 1C58AFE9281D8AE70022595E = {
85 | isa = PBXGroup;
86 | children = (
87 | 1C58AFF4281D8AE70022595E /* XCMonitor */,
88 | 1C5BEE6B283E91B000AC339D /* XCMonitorLauncher */,
89 | 1C58AFF3281D8AE70022595E /* Products */,
90 | );
91 | sourceTree = "";
92 | };
93 | 1C58AFF3281D8AE70022595E /* Products */ = {
94 | isa = PBXGroup;
95 | children = (
96 | 1C58AFF2281D8AE70022595E /* XCMonitor.app */,
97 | 1C5BEE6A283E91B000AC339D /* XCMonitorLauncher.app */,
98 | );
99 | name = Products;
100 | sourceTree = "";
101 | };
102 | 1C58AFF4281D8AE70022595E /* XCMonitor */ = {
103 | isa = PBXGroup;
104 | children = (
105 | 1CE199632854D9D00040CE90 /* XCMonitorApp.swift */,
106 | 1C58B00A281D8CAC0022595E /* Model */,
107 | 1C5BEE80283E981700AC339D /* ViewModel */,
108 | 1C58B00B281D8CB70022595E /* View */,
109 | 1C58B007281D8C290022595E /* Info.plist */,
110 | 1C58AFF9281D8AE80022595E /* Assets.xcassets */,
111 | 1C58AFFE281D8AE80022595E /* XCMonitor.entitlements */,
112 | 1CB48B5C2858E8DD0024FF45 /* Localizable.strings */,
113 | );
114 | path = XCMonitor;
115 | sourceTree = "";
116 | };
117 | 1C58B00A281D8CAC0022595E /* Model */ = {
118 | isa = PBXGroup;
119 | children = (
120 | 1C58AFF5281D8AE70022595E /* AppDelegate.swift */,
121 | 1C27E6EC284E586600AB7911 /* EventHistory.swift */,
122 | );
123 | path = Model;
124 | sourceTree = "";
125 | };
126 | 1C58B00B281D8CB70022595E /* View */ = {
127 | isa = PBXGroup;
128 | children = (
129 | 1C58B010281D8E380022595E /* Extensions.swift */,
130 | 1C58B00E281D8DF90022595E /* MenuBar.swift */,
131 | 1CE1994228548E590040CE90 /* HistoryMenuItem.swift */,
132 | 1CE199652854DB580040CE90 /* SettingsView.swift */,
133 | 1CE199672854DB910040CE90 /* GeneralSettingsView.swift */,
134 | );
135 | path = View;
136 | sourceTree = "";
137 | };
138 | 1C5BEE6B283E91B000AC339D /* XCMonitorLauncher */ = {
139 | isa = PBXGroup;
140 | children = (
141 | 1C5BEE79283E91F800AC339D /* Info.plist */,
142 | 1C5BEE7A283E924500AC339D /* main.swift */,
143 | 1C5BEE6C283E91B000AC339D /* AppDelegate.swift */,
144 | 1C5BEE75283E91B100AC339D /* XCMonitorLauncher.entitlements */,
145 | );
146 | path = XCMonitorLauncher;
147 | sourceTree = "";
148 | };
149 | 1C5BEE80283E981700AC339D /* ViewModel */ = {
150 | isa = PBXGroup;
151 | children = (
152 | 1C58B00C281D8DAB0022595E /* MenuBarModel.swift */,
153 | 1C58B01F281EDDCF0022595E /* GeneralSettingsViewModel.swift */,
154 | );
155 | path = ViewModel;
156 | sourceTree = "";
157 | };
158 | /* End PBXGroup section */
159 |
160 | /* Begin PBXNativeTarget section */
161 | 1C58AFF1281D8AE70022595E /* XCMonitor */ = {
162 | isa = PBXNativeTarget;
163 | buildConfigurationList = 1C58B001281D8AE80022595E /* Build configuration list for PBXNativeTarget "XCMonitor" */;
164 | buildPhases = (
165 | 1C58AFEE281D8AE70022595E /* Sources */,
166 | 1C58AFEF281D8AE70022595E /* Frameworks */,
167 | 1C58AFF0281D8AE70022595E /* Resources */,
168 | 1C5BEE7C283E92D400AC339D /* CopyFiles */,
169 | );
170 | buildRules = (
171 | );
172 | dependencies = (
173 | );
174 | name = XCMonitor;
175 | packageProductDependencies = (
176 | 1C58B022281EE02D0022595E /* XCHook */,
177 | );
178 | productName = XCMonitor;
179 | productReference = 1C58AFF2281D8AE70022595E /* XCMonitor.app */;
180 | productType = "com.apple.product-type.application";
181 | };
182 | 1C5BEE69283E91B000AC339D /* XCMonitorLauncher */ = {
183 | isa = PBXNativeTarget;
184 | buildConfigurationList = 1C5BEE78283E91B100AC339D /* Build configuration list for PBXNativeTarget "XCMonitorLauncher" */;
185 | buildPhases = (
186 | 1C5BEE66283E91B000AC339D /* Sources */,
187 | 1C5BEE67283E91B000AC339D /* Frameworks */,
188 | 1C5BEE68283E91B000AC339D /* Resources */,
189 | );
190 | buildRules = (
191 | );
192 | dependencies = (
193 | );
194 | name = XCMonitorLauncher;
195 | productName = XCMonitorLauncher;
196 | productReference = 1C5BEE6A283E91B000AC339D /* XCMonitorLauncher.app */;
197 | productType = "com.apple.product-type.application";
198 | };
199 | /* End PBXNativeTarget section */
200 |
201 | /* Begin PBXProject section */
202 | 1C58AFEA281D8AE70022595E /* Project object */ = {
203 | isa = PBXProject;
204 | attributes = {
205 | BuildIndependentTargetsInParallel = 1;
206 | LastSwiftUpdateCheck = 1330;
207 | LastUpgradeCheck = 1340;
208 | TargetAttributes = {
209 | 1C58AFF1281D8AE70022595E = {
210 | CreatedOnToolsVersion = 13.3.1;
211 | };
212 | 1C5BEE69283E91B000AC339D = {
213 | CreatedOnToolsVersion = 13.3.1;
214 | };
215 | };
216 | };
217 | buildConfigurationList = 1C58AFED281D8AE70022595E /* Build configuration list for PBXProject "XCMonitor" */;
218 | compatibilityVersion = "Xcode 13.0";
219 | developmentRegion = en;
220 | hasScannedForEncodings = 0;
221 | knownRegions = (
222 | en,
223 | Base,
224 | ja,
225 | );
226 | mainGroup = 1C58AFE9281D8AE70022595E;
227 | packageReferences = (
228 | 1C58B021281EE02D0022595E /* XCRemoteSwiftPackageReference "XCHook" */,
229 | );
230 | productRefGroup = 1C58AFF3281D8AE70022595E /* Products */;
231 | projectDirPath = "";
232 | projectRoot = "";
233 | targets = (
234 | 1C58AFF1281D8AE70022595E /* XCMonitor */,
235 | 1C5BEE69283E91B000AC339D /* XCMonitorLauncher */,
236 | );
237 | };
238 | /* End PBXProject section */
239 |
240 | /* Begin PBXResourcesBuildPhase section */
241 | 1C58AFF0281D8AE70022595E /* Resources */ = {
242 | isa = PBXResourcesBuildPhase;
243 | buildActionMask = 2147483647;
244 | files = (
245 | 1C58AFFA281D8AE80022595E /* Assets.xcassets in Resources */,
246 | 1CB48B5A2858E8DD0024FF45 /* Localizable.strings in Resources */,
247 | );
248 | runOnlyForDeploymentPostprocessing = 0;
249 | };
250 | 1C5BEE68283E91B000AC339D /* Resources */ = {
251 | isa = PBXResourcesBuildPhase;
252 | buildActionMask = 2147483647;
253 | files = (
254 | );
255 | runOnlyForDeploymentPostprocessing = 0;
256 | };
257 | /* End PBXResourcesBuildPhase section */
258 |
259 | /* Begin PBXSourcesBuildPhase section */
260 | 1C58AFEE281D8AE70022595E /* Sources */ = {
261 | isa = PBXSourcesBuildPhase;
262 | buildActionMask = 2147483647;
263 | files = (
264 | 1C58B00D281D8DAB0022595E /* MenuBarModel.swift in Sources */,
265 | 1C58B011281D8E380022595E /* Extensions.swift in Sources */,
266 | 1CE199642854D9D00040CE90 /* XCMonitorApp.swift in Sources */,
267 | 1CE1994328548E590040CE90 /* HistoryMenuItem.swift in Sources */,
268 | 1C58B020281EDDCF0022595E /* GeneralSettingsViewModel.swift in Sources */,
269 | 1C58AFF6281D8AE70022595E /* AppDelegate.swift in Sources */,
270 | 1CE199682854DB910040CE90 /* GeneralSettingsView.swift in Sources */,
271 | 1C27E6ED284E586600AB7911 /* EventHistory.swift in Sources */,
272 | 1C58B00F281D8DF90022595E /* MenuBar.swift in Sources */,
273 | 1CE199662854DB580040CE90 /* SettingsView.swift in Sources */,
274 | );
275 | runOnlyForDeploymentPostprocessing = 0;
276 | };
277 | 1C5BEE66283E91B000AC339D /* Sources */ = {
278 | isa = PBXSourcesBuildPhase;
279 | buildActionMask = 2147483647;
280 | files = (
281 | 1C5BEE7B283E924500AC339D /* main.swift in Sources */,
282 | 1C5BEE6D283E91B000AC339D /* AppDelegate.swift in Sources */,
283 | );
284 | runOnlyForDeploymentPostprocessing = 0;
285 | };
286 | /* End PBXSourcesBuildPhase section */
287 |
288 | /* Begin PBXVariantGroup section */
289 | 1CB48B5C2858E8DD0024FF45 /* Localizable.strings */ = {
290 | isa = PBXVariantGroup;
291 | children = (
292 | 1CB48B5B2858E8DD0024FF45 /* en */,
293 | 1CB48B5D2858E8E10024FF45 /* ja */,
294 | );
295 | name = Localizable.strings;
296 | sourceTree = "";
297 | };
298 | /* End PBXVariantGroup section */
299 |
300 | /* Begin XCBuildConfiguration section */
301 | 1C58AFFF281D8AE80022595E /* Debug */ = {
302 | isa = XCBuildConfiguration;
303 | buildSettings = {
304 | ALWAYS_SEARCH_USER_PATHS = NO;
305 | CLANG_ANALYZER_NONNULL = YES;
306 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
308 | CLANG_ENABLE_MODULES = YES;
309 | CLANG_ENABLE_OBJC_ARC = YES;
310 | CLANG_ENABLE_OBJC_WEAK = YES;
311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
312 | CLANG_WARN_BOOL_CONVERSION = YES;
313 | CLANG_WARN_COMMA = YES;
314 | CLANG_WARN_CONSTANT_CONVERSION = YES;
315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
317 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
318 | CLANG_WARN_EMPTY_BODY = YES;
319 | CLANG_WARN_ENUM_CONVERSION = YES;
320 | CLANG_WARN_INFINITE_RECURSION = YES;
321 | CLANG_WARN_INT_CONVERSION = YES;
322 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
323 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
324 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
325 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
326 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
327 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
328 | CLANG_WARN_STRICT_PROTOTYPES = YES;
329 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
330 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
331 | CLANG_WARN_UNREACHABLE_CODE = YES;
332 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
333 | COPY_PHASE_STRIP = NO;
334 | DEBUG_INFORMATION_FORMAT = dwarf;
335 | ENABLE_STRICT_OBJC_MSGSEND = YES;
336 | ENABLE_TESTABILITY = YES;
337 | GCC_C_LANGUAGE_STANDARD = gnu11;
338 | GCC_DYNAMIC_NO_PIC = NO;
339 | GCC_NO_COMMON_BLOCKS = YES;
340 | GCC_OPTIMIZATION_LEVEL = 0;
341 | GCC_PREPROCESSOR_DEFINITIONS = (
342 | "DEBUG=1",
343 | "$(inherited)",
344 | );
345 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
346 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
347 | GCC_WARN_UNDECLARED_SELECTOR = YES;
348 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
349 | GCC_WARN_UNUSED_FUNCTION = YES;
350 | GCC_WARN_UNUSED_VARIABLE = YES;
351 | MACOSX_DEPLOYMENT_TARGET = 11.0;
352 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
353 | MTL_FAST_MATH = YES;
354 | ONLY_ACTIVE_ARCH = YES;
355 | SDKROOT = macosx;
356 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
357 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
358 | };
359 | name = Debug;
360 | };
361 | 1C58B000281D8AE80022595E /* Release */ = {
362 | isa = XCBuildConfiguration;
363 | buildSettings = {
364 | ALWAYS_SEARCH_USER_PATHS = NO;
365 | CLANG_ANALYZER_NONNULL = YES;
366 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
367 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
368 | CLANG_ENABLE_MODULES = YES;
369 | CLANG_ENABLE_OBJC_ARC = YES;
370 | CLANG_ENABLE_OBJC_WEAK = YES;
371 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
372 | CLANG_WARN_BOOL_CONVERSION = YES;
373 | CLANG_WARN_COMMA = YES;
374 | CLANG_WARN_CONSTANT_CONVERSION = YES;
375 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
376 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
377 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
378 | CLANG_WARN_EMPTY_BODY = YES;
379 | CLANG_WARN_ENUM_CONVERSION = YES;
380 | CLANG_WARN_INFINITE_RECURSION = YES;
381 | CLANG_WARN_INT_CONVERSION = YES;
382 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
383 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
384 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
385 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
386 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
387 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
388 | CLANG_WARN_STRICT_PROTOTYPES = YES;
389 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
390 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
391 | CLANG_WARN_UNREACHABLE_CODE = YES;
392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
393 | COPY_PHASE_STRIP = NO;
394 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
395 | ENABLE_NS_ASSERTIONS = NO;
396 | ENABLE_STRICT_OBJC_MSGSEND = YES;
397 | GCC_C_LANGUAGE_STANDARD = gnu11;
398 | GCC_NO_COMMON_BLOCKS = YES;
399 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
400 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
401 | GCC_WARN_UNDECLARED_SELECTOR = YES;
402 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
403 | GCC_WARN_UNUSED_FUNCTION = YES;
404 | GCC_WARN_UNUSED_VARIABLE = YES;
405 | MACOSX_DEPLOYMENT_TARGET = 11.0;
406 | MTL_ENABLE_DEBUG_INFO = NO;
407 | MTL_FAST_MATH = YES;
408 | SDKROOT = macosx;
409 | SWIFT_COMPILATION_MODE = wholemodule;
410 | SWIFT_OPTIMIZATION_LEVEL = "-O";
411 | };
412 | name = Release;
413 | };
414 | 1C58B002281D8AE80022595E /* Debug */ = {
415 | isa = XCBuildConfiguration;
416 | buildSettings = {
417 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
418 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
419 | CODE_SIGN_ENTITLEMENTS = XCMonitor/XCMonitor.entitlements;
420 | CODE_SIGN_IDENTITY = "-";
421 | CODE_SIGN_STYLE = Automatic;
422 | COMBINE_HIDPI_IMAGES = YES;
423 | CURRENT_PROJECT_VERSION = 1.4.0;
424 | DEVELOPMENT_TEAM = VJ5N2X84K8;
425 | ENABLE_HARDENED_RUNTIME = YES;
426 | GENERATE_INFOPLIST_FILE = YES;
427 | INFOPLIST_FILE = XCMonitor/Info.plist;
428 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
429 | INFOPLIST_KEY_NSHumanReadableCopyright = "© 2022 Takuto Nakamura";
430 | INFOPLIST_KEY_NSPrincipalClass = NSApplication;
431 | LD_RUNPATH_SEARCH_PATHS = (
432 | "$(inherited)",
433 | "@executable_path/../Frameworks",
434 | );
435 | MARKETING_VERSION = 1.4;
436 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.XCMonitor;
437 | PRODUCT_NAME = "$(TARGET_NAME)";
438 | SWIFT_EMIT_LOC_STRINGS = YES;
439 | SWIFT_VERSION = 5.0;
440 | };
441 | name = Debug;
442 | };
443 | 1C58B003281D8AE80022595E /* Release */ = {
444 | isa = XCBuildConfiguration;
445 | buildSettings = {
446 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
447 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
448 | CODE_SIGN_ENTITLEMENTS = XCMonitor/XCMonitor.entitlements;
449 | CODE_SIGN_IDENTITY = "-";
450 | CODE_SIGN_STYLE = Automatic;
451 | COMBINE_HIDPI_IMAGES = YES;
452 | CURRENT_PROJECT_VERSION = 1.4.0;
453 | DEVELOPMENT_TEAM = VJ5N2X84K8;
454 | ENABLE_HARDENED_RUNTIME = YES;
455 | GENERATE_INFOPLIST_FILE = YES;
456 | INFOPLIST_FILE = XCMonitor/Info.plist;
457 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
458 | INFOPLIST_KEY_NSHumanReadableCopyright = "© 2022 Takuto Nakamura";
459 | INFOPLIST_KEY_NSPrincipalClass = NSApplication;
460 | LD_RUNPATH_SEARCH_PATHS = (
461 | "$(inherited)",
462 | "@executable_path/../Frameworks",
463 | );
464 | MARKETING_VERSION = 1.4;
465 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.XCMonitor;
466 | PRODUCT_NAME = "$(TARGET_NAME)";
467 | SWIFT_EMIT_LOC_STRINGS = YES;
468 | SWIFT_VERSION = 5.0;
469 | };
470 | name = Release;
471 | };
472 | 1C5BEE76283E91B100AC339D /* Debug */ = {
473 | isa = XCBuildConfiguration;
474 | buildSettings = {
475 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
476 | CODE_SIGN_ENTITLEMENTS = XCMonitorLauncher/XCMonitorLauncher.entitlements;
477 | CODE_SIGN_IDENTITY = "-";
478 | CODE_SIGN_STYLE = Automatic;
479 | COMBINE_HIDPI_IMAGES = YES;
480 | CURRENT_PROJECT_VERSION = 1.4.0;
481 | DEVELOPMENT_TEAM = VJ5N2X84K8;
482 | ENABLE_HARDENED_RUNTIME = YES;
483 | GENERATE_INFOPLIST_FILE = YES;
484 | INFOPLIST_FILE = XCMonitorLauncher/Info.plist;
485 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
486 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
487 | INFOPLIST_KEY_NSPrincipalClass = NSApplication;
488 | LD_RUNPATH_SEARCH_PATHS = (
489 | "$(inherited)",
490 | "@executable_path/../Frameworks",
491 | );
492 | MACOSX_DEPLOYMENT_TARGET = 11.0;
493 | MARKETING_VERSION = 1.4;
494 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.XCMonitorLauncher;
495 | PRODUCT_NAME = "$(TARGET_NAME)";
496 | SKIP_INSTALL = YES;
497 | SWIFT_EMIT_LOC_STRINGS = YES;
498 | SWIFT_VERSION = 5.0;
499 | };
500 | name = Debug;
501 | };
502 | 1C5BEE77283E91B100AC339D /* Release */ = {
503 | isa = XCBuildConfiguration;
504 | buildSettings = {
505 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
506 | CODE_SIGN_ENTITLEMENTS = XCMonitorLauncher/XCMonitorLauncher.entitlements;
507 | CODE_SIGN_IDENTITY = "-";
508 | CODE_SIGN_STYLE = Automatic;
509 | COMBINE_HIDPI_IMAGES = YES;
510 | CURRENT_PROJECT_VERSION = 1.4.0;
511 | DEVELOPMENT_TEAM = VJ5N2X84K8;
512 | ENABLE_HARDENED_RUNTIME = YES;
513 | GENERATE_INFOPLIST_FILE = YES;
514 | INFOPLIST_FILE = XCMonitorLauncher/Info.plist;
515 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
516 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
517 | INFOPLIST_KEY_NSPrincipalClass = NSApplication;
518 | LD_RUNPATH_SEARCH_PATHS = (
519 | "$(inherited)",
520 | "@executable_path/../Frameworks",
521 | );
522 | MACOSX_DEPLOYMENT_TARGET = 11.0;
523 | MARKETING_VERSION = 1.4;
524 | PRODUCT_BUNDLE_IDENTIFIER = com.kyome.XCMonitorLauncher;
525 | PRODUCT_NAME = "$(TARGET_NAME)";
526 | SKIP_INSTALL = YES;
527 | SWIFT_EMIT_LOC_STRINGS = YES;
528 | SWIFT_VERSION = 5.0;
529 | };
530 | name = Release;
531 | };
532 | /* End XCBuildConfiguration section */
533 |
534 | /* Begin XCConfigurationList section */
535 | 1C58AFED281D8AE70022595E /* Build configuration list for PBXProject "XCMonitor" */ = {
536 | isa = XCConfigurationList;
537 | buildConfigurations = (
538 | 1C58AFFF281D8AE80022595E /* Debug */,
539 | 1C58B000281D8AE80022595E /* Release */,
540 | );
541 | defaultConfigurationIsVisible = 0;
542 | defaultConfigurationName = Release;
543 | };
544 | 1C58B001281D8AE80022595E /* Build configuration list for PBXNativeTarget "XCMonitor" */ = {
545 | isa = XCConfigurationList;
546 | buildConfigurations = (
547 | 1C58B002281D8AE80022595E /* Debug */,
548 | 1C58B003281D8AE80022595E /* Release */,
549 | );
550 | defaultConfigurationIsVisible = 0;
551 | defaultConfigurationName = Release;
552 | };
553 | 1C5BEE78283E91B100AC339D /* Build configuration list for PBXNativeTarget "XCMonitorLauncher" */ = {
554 | isa = XCConfigurationList;
555 | buildConfigurations = (
556 | 1C5BEE76283E91B100AC339D /* Debug */,
557 | 1C5BEE77283E91B100AC339D /* Release */,
558 | );
559 | defaultConfigurationIsVisible = 0;
560 | defaultConfigurationName = Release;
561 | };
562 | /* End XCConfigurationList section */
563 |
564 | /* Begin XCRemoteSwiftPackageReference section */
565 | 1C58B021281EE02D0022595E /* XCRemoteSwiftPackageReference "XCHook" */ = {
566 | isa = XCRemoteSwiftPackageReference;
567 | repositoryURL = "git@github.com:Kyome22/XCHook.git";
568 | requirement = {
569 | kind = exactVersion;
570 | version = 0.1.6;
571 | };
572 | };
573 | /* End XCRemoteSwiftPackageReference section */
574 |
575 | /* Begin XCSwiftPackageProductDependency section */
576 | 1C58B022281EE02D0022595E /* XCHook */ = {
577 | isa = XCSwiftPackageProductDependency;
578 | package = 1C58B021281EE02D0022595E /* XCRemoteSwiftPackageReference "XCHook" */;
579 | productName = XCHook;
580 | };
581 | /* End XCSwiftPackageProductDependency section */
582 | };
583 | rootObject = 1C58AFEA281D8AE70022595E /* Project object */;
584 | }
585 |
--------------------------------------------------------------------------------
/XCMonitor.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/XCMonitor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/XCMonitor.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "xchook",
5 | "kind" : "remoteSourceControl",
6 | "location" : "git@github.com:Kyome22/XCHook.git",
7 | "state" : {
8 | "revision" : "8894182ecd8a72e91f67c9de8ccbab0048c15425",
9 | "version" : "0.1.6"
10 | }
11 | }
12 | ],
13 | "version" : 2
14 | }
15 |
--------------------------------------------------------------------------------
/XCMonitor.xcodeproj/xcshareddata/xcschemes/XCMonitor.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
45 |
51 |
52 |
53 |
54 |
60 |
62 |
68 |
69 |
70 |
71 |
73 |
74 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icon_16x16.png",
5 | "idiom" : "mac",
6 | "scale" : "1x",
7 | "size" : "16x16"
8 | },
9 | {
10 | "filename" : "icon_16x16@2x.png",
11 | "idiom" : "mac",
12 | "scale" : "2x",
13 | "size" : "16x16"
14 | },
15 | {
16 | "filename" : "icon_32x32.png",
17 | "idiom" : "mac",
18 | "scale" : "1x",
19 | "size" : "32x32"
20 | },
21 | {
22 | "filename" : "icon_32x32@2x.png",
23 | "idiom" : "mac",
24 | "scale" : "2x",
25 | "size" : "32x32"
26 | },
27 | {
28 | "filename" : "icon_128x128.png",
29 | "idiom" : "mac",
30 | "scale" : "1x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "filename" : "icon_128x128@2x.png",
35 | "idiom" : "mac",
36 | "scale" : "2x",
37 | "size" : "128x128"
38 | },
39 | {
40 | "filename" : "icon_256x256.png",
41 | "idiom" : "mac",
42 | "scale" : "1x",
43 | "size" : "256x256"
44 | },
45 | {
46 | "filename" : "icon_256x256@2x.png",
47 | "idiom" : "mac",
48 | "scale" : "2x",
49 | "size" : "256x256"
50 | },
51 | {
52 | "filename" : "icon_512x512.png",
53 | "idiom" : "mac",
54 | "scale" : "1x",
55 | "size" : "512x512"
56 | },
57 | {
58 | "filename" : "icon_512x512@2x.png",
59 | "idiom" : "mac",
60 | "scale" : "2x",
61 | "size" : "512x512"
62 | }
63 | ],
64 | "info" : {
65 | "author" : "xcode",
66 | "version" : 1
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_128x128.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_16x16.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_256x256.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_32x32.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_512x512.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/General.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "general.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "general@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "template"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/General.imageset/general.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/General.imageset/general.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/General.imageset/general@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/General.imageset/general@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-fails-dark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build_fails.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build_fails@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-fails-dark.imageset/build_fails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-fails-dark.imageset/build_fails.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-fails-dark.imageset/build_fails@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-fails-dark.imageset/build_fails@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-fails-light.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build_fails.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build_fails@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-fails-light.imageset/build_fails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-fails-light.imageset/build_fails.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-fails-light.imageset/build_fails@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-fails-light.imageset/build_fails@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-start-dark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build_start.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build_start@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-start-dark.imageset/build_start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-start-dark.imageset/build_start.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-start-dark.imageset/build_start@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-start-dark.imageset/build_start@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-start-light.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build_start.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build_start@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-start-light.imageset/build_start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-start-light.imageset/build_start.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-start-light.imageset/build_start@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-start-light.imageset/build_start@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-dark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build_succeeds.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build_succeeds@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-dark.imageset/build_succeeds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-dark.imageset/build_succeeds.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-dark.imageset/build_succeeds@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-dark.imageset/build_succeeds@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-light.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build_succeeds.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build_succeeds@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-light.imageset/build_succeeds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-light.imageset/build_succeeds.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-light.imageset/build_succeeds@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/build-succeeds-light.imageset/build_succeeds@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/standby-dark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "standby.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "standby@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/standby-dark.imageset/standby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/standby-dark.imageset/standby.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/standby-dark.imageset/standby@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/standby-dark.imageset/standby@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/standby-light.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "standby.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "standby@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/standby-light.imageset/standby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/standby-light.imageset/standby.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/standby-light.imageset/standby@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/standby-light.imageset/standby@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-fails-dark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "testing_fails.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "testing_fails@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-fails-dark.imageset/testing_fails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-fails-dark.imageset/testing_fails.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-fails-dark.imageset/testing_fails@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-fails-dark.imageset/testing_fails@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-fails-light.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "testing_fails.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "testing_fails@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-fails-light.imageset/testing_fails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-fails-light.imageset/testing_fails.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-fails-light.imageset/testing_fails@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-fails-light.imageset/testing_fails@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-start-dark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "testing_start.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "testing_start@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-start-dark.imageset/testing_start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-start-dark.imageset/testing_start.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-start-dark.imageset/testing_start@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-start-dark.imageset/testing_start@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-start-light.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "testing_start.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "testing_start@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-start-light.imageset/testing_start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-start-light.imageset/testing_start.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-start-light.imageset/testing_start@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-start-light.imageset/testing_start@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-dark.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "testing_succeeds.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "testing_succeeds@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-dark.imageset/testing_succeeds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-dark.imageset/testing_succeeds.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-dark.imageset/testing_succeeds@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-dark.imageset/testing_succeeds@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-light.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "testing_succeeds.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "testing_succeeds@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-light.imageset/testing_succeeds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-light.imageset/testing_succeeds.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-light.imageset/testing_succeeds@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuBar/testing-succeeds-light.imageset/testing_succeeds@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/build-failed.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build-failed.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build-failed@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/build-failed.imageset/build-failed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/build-failed.imageset/build-failed.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/build-failed.imageset/build-failed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/build-failed.imageset/build-failed@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/build-succeeded.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "build-succeeded.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "build-succeeded@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/build-succeeded.imageset/build-succeeded.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/build-succeeded.imageset/build-succeeded.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/build-succeeded.imageset/build-succeeded@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/build-succeeded.imageset/build-succeeded@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/test-failed.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "test-failed.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "test-failed@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/test-failed.imageset/test-failed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/test-failed.imageset/test-failed.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/test-failed.imageset/test-failed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/test-failed.imageset/test-failed@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/test-succeeded.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "test-succeeded.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "test-succeeded@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | },
18 | "properties" : {
19 | "template-rendering-intent" : "original"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/test-succeeded.imageset/test-succeeded.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/test-succeeded.imageset/test-succeeded.png
--------------------------------------------------------------------------------
/XCMonitor/Assets.xcassets/MenuItem/test-succeeded.imageset/test-succeeded@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Kyome22/XCMonitor/b1731177dd950188f6cc5cb1feeac7c3987e572f/XCMonitor/Assets.xcassets/MenuItem/test-succeeded.imageset/test-succeeded@2x.png
--------------------------------------------------------------------------------
/XCMonitor/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LSUIElement
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/XCMonitor/Model/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/05/01.
6 | //
7 |
8 | import Cocoa
9 | import SwiftUI
10 |
11 | let XCODE_BUNDLE_IDENTIFIER = "com.apple.dt.Xcode"
12 |
13 | final class AppDelegate: NSObject, NSApplicationDelegate {
14 | private var menuBarModel: MenuBarModel!
15 |
16 | func applicationDidFinishLaunching(_ aNotification: Notification) {
17 | NSApp.setActivationPolicy(.accessory)
18 | menuBarModel = MenuBarModel()
19 | }
20 |
21 | func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {
22 | return true
23 | }
24 |
25 | @objc func openPreferencesWindow() {
26 | NSApp.sendAction(Selector(("showPreferencesWindow:")), to: nil, from: nil)
27 | NSApp.windows.forEach { window in
28 | if window.canBecomeMain {
29 | window.orderFrontRegardless()
30 | NSApp.activate(ignoringOtherApps: true)
31 | }
32 | }
33 | }
34 |
35 | @objc func openAboutWindow() {
36 | NSApp.activate(ignoringOtherApps: true)
37 | NSApp.orderFrontStandardAboutPanel()
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/XCMonitor/Model/EventHistory.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EventHistory.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/06/07.
6 | //
7 |
8 | import Foundation
9 |
10 | enum EventType: String {
11 | case buildSucceeded = "Build Succeeded"
12 | case buildFailed = "Build Failed"
13 | case testSucceeded = "Test Succeeded"
14 | case testFailed = "Test Failed"
15 |
16 | var imageName: String {
17 | switch self {
18 | case .buildSucceeded: return "build-succeeded"
19 | case .buildFailed: return "build-failed"
20 | case .testSucceeded: return "test-succeeded"
21 | case .testFailed: return "test-failed"
22 | }
23 | }
24 | }
25 |
26 | struct EventHistory {
27 | let project: String
28 | let eventType: EventType
29 | let elapsedTime: Double
30 | let projectURL: URL?
31 | }
32 |
--------------------------------------------------------------------------------
/XCMonitor/View/Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Extensions.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/05/01.
6 | //
7 |
8 | import Cocoa
9 |
10 | extension String {
11 | var localized: String {
12 | return NSLocalizedString(self, comment: self)
13 | }
14 | }
15 |
16 | extension NSStatusItem {
17 | static var `default`: NSStatusItem {
18 | return NSStatusBar.system.statusItem(withLength: Self.variableLength)
19 | }
20 | }
21 |
22 | extension NSMenuItem {
23 | convenience init(title: String, action: Selector) {
24 | self.init(title: title, action: action, keyEquivalent: "")
25 | }
26 | }
27 |
28 | extension NSAppearance {
29 | var isDark: Bool {
30 | if self.name == .vibrantDark { return true }
31 | guard #available(macOS 10.14, *) else { return false }
32 | return self.bestMatch(from: [.aqua, .darkAqua]) == .darkAqua
33 | }
34 | }
35 |
36 | extension Bool {
37 | var state: NSControl.StateValue {
38 | return self ? .on : .off
39 | }
40 | }
41 |
42 | extension NSControl.StateValue {
43 | var isOn: Bool {
44 | return self == .on
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/XCMonitor/View/GeneralSettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GeneralSettingsView.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/06/11.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct GeneralSettingsView: View {
11 | @StateObject var viewModel = GeneralSettingsViewModel()
12 |
13 | var body: some View {
14 | Form {
15 | VStack {
16 | Text("permission")
17 |
18 | Button {
19 | viewModel.openSystemPreferences()
20 | } label: {
21 | Text("openSystemPreferences")
22 | }
23 | Divider()
24 | HStack {
25 | VStack(alignment: .trailing, spacing: 8) {
26 | Text("XCHook:")
27 | Text("startup:")
28 | }
29 | VStack(alignment: .leading, spacing: 8) {
30 | Toggle(isOn: $viewModel.xchookEnabled) {
31 | Text("enableScripts")
32 | }
33 | .disabled(viewModel.showingAlert)
34 | .onChange(of: viewModel.xchookEnabled) { newValue in
35 | viewModel.toggleXCHookEnabled(newValue)
36 | }
37 | Toggle(isOn: $viewModel.launchAtLogin) {
38 | Text("launchAtLogin")
39 | }
40 | .onChange(of: viewModel.launchAtLogin) { newValue in
41 | viewModel.toggleLaunchAtLogin(newValue)
42 | }
43 | }
44 | }
45 | }
46 | }
47 | .fixedSize()
48 | .padding(20)
49 | .alert(isPresented: $viewModel.showingAlert) {
50 | switch viewModel.alertType {
51 | case .xcodePlistNotFound:
52 | return Alert(title: Text("plistNotFoundTitle"),
53 | message: Text("plistNotFoundMessage"))
54 | case .xcodeIsRunning:
55 | return Alert(title: Text("xcodeIsRunningTitle"),
56 | message: Text("xcodeIsRunningMessage"))
57 | case .xchookWarning:
58 | let enableButton = Alert.Button.default(Text("xchookConfirmEnable")) {
59 | viewModel.react(for: true)
60 | }
61 | let cancelButton = Alert.Button.cancel {
62 | viewModel.react(for: false)
63 | }
64 | return Alert(title: Text("xchookConfirmTitle"),
65 | message: Text("xchookConfirmMessage"),
66 | primaryButton: enableButton,
67 | secondaryButton: cancelButton)
68 | }
69 | }
70 | }
71 | }
72 |
73 | struct GeneralSettingsView_Previews: PreviewProvider {
74 | static var previews: some View {
75 | GeneralSettingsView()
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/XCMonitor/View/HistoryMenuItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HistoryMenuItem.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/06/11.
6 | //
7 |
8 | import AppKit
9 |
10 | final class HistoryMenuItem: NSMenuItem {
11 | let projectURL: URL?
12 |
13 | init(title: String, projectURL: URL?, image: NSImage?, target: AnyObject?, action: Selector) {
14 | self.projectURL = projectURL
15 | super.init(title: title, action: action, keyEquivalent: "")
16 | self.image = image
17 | self.target = target
18 | }
19 |
20 | required init(coder: NSCoder) {
21 | fatalError("init(coder:) has not been implemented")
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/XCMonitor/View/MenuBar.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MenuBar.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/05/01.
6 | //
7 |
8 | import AppKit
9 | import Combine
10 | import XCHook
11 |
12 | final class MenuBar {
13 | private let statusItem = NSStatusItem.default
14 | private let button: NSStatusBarButton
15 | private let menu = NSMenu()
16 | private let projectItem: NSMenuItem
17 | private let historiesMenu = NSMenu()
18 |
19 | var isDark: Bool {
20 | return button.superview!.effectiveAppearance.isDark
21 | }
22 | var isDarkPublisher: AnyPublisher {
23 | return button.superview!
24 | .publisher(for: \.effectiveAppearance, options: .new)
25 | .eraseToAnyPublisher()
26 | }
27 |
28 | init() {
29 | button = statusItem.button!
30 | let isDark = button.superview!.effectiveAppearance.isDark
31 | let imageName = isDark ? "standby-dark" : "standby-light"
32 | button.image = NSImage(named: imageName)
33 |
34 | statusItem.menu = menu
35 |
36 | projectItem = NSMenuItem(
37 | title: "noProject".localized,
38 | action: #selector(MenuBarModel.openProject(_:))
39 | )
40 | menu.addItem(projectItem)
41 |
42 | let emptyItem = NSMenuItem(title: "empty".localized,
43 | action: nil,
44 | keyEquivalent: "")
45 | emptyItem.isEnabled = false
46 | historiesMenu.addItem(emptyItem)
47 | let historiesItem = NSMenuItem(title: "eventHistory".localized,
48 | action: nil,
49 | keyEquivalent: "")
50 | historiesItem.submenu = historiesMenu
51 | menu.addItem(historiesItem)
52 |
53 | menu.addItem(NSMenuItem.separator())
54 |
55 | let preferencesItem = NSMenuItem(
56 | title: "preferences".localized,
57 | action: #selector(AppDelegate.openPreferencesWindow)
58 | )
59 | menu.addItem(preferencesItem)
60 | menu.addItem(NSMenuItem.separator())
61 |
62 | let aboutItem = NSMenuItem(
63 | title: "aboutApp".localized,
64 | action: #selector(AppDelegate.openAboutWindow)
65 | )
66 | menu.addItem(aboutItem)
67 |
68 | let terminateItem = NSMenuItem(
69 | title: "terminateApp".localized,
70 | action: #selector(NSApp.terminate(_:))
71 | )
72 | menu.addItem(terminateItem)
73 | }
74 |
75 | func setTarget(_ target: MenuBarModel) {
76 | projectItem.target = target
77 | }
78 |
79 | func updateStatus(event: XCHookEvent, isDark: Bool) {
80 | if event.project.isEmpty {
81 | projectItem.title = "noProject".localized
82 | } else {
83 | projectItem.title = "showProject".localized
84 | .replacingOccurrences(of: "PROJECT", with: event.project)
85 | }
86 |
87 | var imageName: String = ""
88 | switch event.status {
89 | case .standby: imageName = "standby"
90 | case .buildStart: imageName = "build-start"
91 | case .buildSucceeds: imageName = "build-succeeds"
92 | case .buildFails: imageName = "build-fails"
93 | case .testingStart: imageName = "testing-start"
94 | case .testingSucceeds: imageName = "testing-succeeds"
95 | case .testingFails: imageName = "testing-fails"
96 | }
97 | imageName += isDark ? "-dark" : "-light"
98 | button.image = NSImage(named: imageName)
99 | }
100 |
101 | func updateEventHistories(_ eventHistories: [EventHistory], _ target: MenuBarModel) {
102 | historiesMenu.removeAllItems()
103 | eventHistories.forEach { eventHistory in
104 | let title = String(format: "%@: %@ (%.3f sec)",
105 | eventHistory.project,
106 | eventHistory.eventType.rawValue,
107 | eventHistory.elapsedTime)
108 | let item = HistoryMenuItem(title: title,
109 | projectURL: eventHistory.projectURL,
110 | image: NSImage(named: eventHistory.eventType.imageName),
111 | target: target,
112 | action: #selector(MenuBarModel.openHistoricalProject(_:)))
113 | historiesMenu.addItem(item)
114 | }
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/XCMonitor/View/SettingsView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SettingsView.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/06/11.
6 | //
7 |
8 | import SwiftUI
9 |
10 | struct SettingsView: View {
11 | private enum Tabs: Hashable {
12 | case general
13 | }
14 |
15 | var body: some View {
16 | TabView {
17 | GeneralSettingsView()
18 | .tabItem {
19 | Label("general", systemImage: "gear")
20 | }
21 | .tag(Tabs.general)
22 | }
23 | }
24 | }
25 |
26 | struct SettingsView_Previews: PreviewProvider {
27 | static var previews: some View {
28 | SettingsView()
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/XCMonitor/ViewModel/GeneralSettingsViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GeneralSettingsViewModel.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/05/02.
6 | //
7 |
8 | import SwiftUI
9 | import Combine
10 | import XCHook
11 | import ServiceManagement
12 |
13 | final class GeneralSettingsViewModel: ObservableObject {
14 | enum AlertType {
15 | case xcodePlistNotFound
16 | case xcodeIsRunning
17 | case xchookWarning
18 | }
19 |
20 | var innerXchookEnabled: Bool = false
21 | @Published var xchookEnabled: Bool
22 | var innerLaunchAtLogin: Bool = false
23 | @Published var launchAtLogin: Bool
24 | @Published var showingAlert: Bool = false
25 | var alertType: AlertType = .xcodePlistNotFound
26 |
27 | private let xchook: XCHook?
28 |
29 | init() {
30 | xchook = XCHook()
31 | innerXchookEnabled = xchook?.isInstalled() ?? false
32 | xchookEnabled = innerXchookEnabled
33 | let jobDicts = SMCopyAllJobDictionaries(kSMDomainUserLaunchd)
34 | .takeRetainedValue() as NSArray as! [[String:AnyObject]]
35 | innerLaunchAtLogin = jobDicts.contains { dict in
36 | return dict["Label"] as! String == "com.kyome.XCMonitorLauncher"
37 | }
38 | launchAtLogin = innerLaunchAtLogin
39 | }
40 |
41 | func openSystemPreferences() {
42 | let path = "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"
43 | NSWorkspace.shared.open(URL(string: path)!)
44 | }
45 |
46 | func toggleXCHookEnabled(_ newValue: Bool) {
47 | if newValue == innerXchookEnabled {
48 | return
49 | }
50 | guard let xchook = xchook else {
51 | innerXchookEnabled = false
52 | xchookEnabled = innerXchookEnabled
53 | showingAlert = true
54 | alertType = .xcodePlistNotFound
55 | return
56 | }
57 |
58 | // Show an alert to quit Xcode.app if it is running.
59 | let isRunningXcode = NSWorkspace.shared.runningApplications
60 | .contains(where: { app in
61 | return app.bundleIdentifier == XCODE_BUNDLE_IDENTIFIER
62 | && app.localizedName == "Xcode"
63 | })
64 | if isRunningXcode {
65 | xchookEnabled = innerXchookEnabled
66 | showingAlert = true
67 | alertType = .xcodeIsRunning
68 | return
69 | }
70 |
71 | if newValue {
72 | showingAlert = true
73 | alertType = .xchookWarning
74 | } else {
75 | xchook.uninstall()
76 | innerXchookEnabled = false
77 | }
78 | }
79 |
80 | func react(for userResponse: Bool) {
81 | if let xchook = xchook, userResponse {
82 | innerXchookEnabled = true
83 | xchook.install()
84 | } else {
85 | innerXchookEnabled = false
86 | xchookEnabled = innerXchookEnabled
87 | }
88 | }
89 |
90 | func toggleLaunchAtLogin(_ newValue: Bool) {
91 | if newValue == innerLaunchAtLogin {
92 | return
93 | }
94 | if SMLoginItemSetEnabled("com.kyome.XCMonitorLauncher" as CFString, newValue) {
95 | innerLaunchAtLogin = newValue
96 | } else {
97 | launchAtLogin = innerLaunchAtLogin
98 | }
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/XCMonitor/ViewModel/MenuBarModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MenuBarModel.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/05/01.
6 | //
7 |
8 | import Cocoa
9 | import Combine
10 | import XCHook
11 |
12 | final class MenuBarModel: NSObject {
13 | private let MAX_EVENTS: Int = 50 // max histories = 25
14 | private let menuBar = MenuBar()
15 |
16 | private var event: XCHookEvent
17 | private var eventList = [XCHookEvent]()
18 | private var isDark: Bool
19 | private var cancellables = Set()
20 |
21 | override init() {
22 | event = XCHookEvent.standby
23 | isDark = menuBar.isDark
24 | super.init()
25 |
26 | menuBar.setTarget(self)
27 |
28 | menuBar.isDarkPublisher
29 | .sink { [weak self] appearance in
30 | guard let self = self else { return }
31 | self.isDark = appearance.isDark
32 | self.menuBar.updateStatus(event: self.event, isDark: self.isDark)
33 | }
34 | .store(in: &cancellables)
35 |
36 | XCHookReceiver.shared.xchookPublisher
37 | .sink { [weak self] event in
38 | guard let self = self else { return }
39 | self.addEvent(event)
40 | if self.event.timestamp < event.timestamp {
41 | self.event = event
42 | self.menuBar.updateStatus(event: self.event, isDark: self.isDark)
43 | }
44 | }
45 | .store(in: &cancellables)
46 |
47 | NSWorkspace.shared.notificationCenter
48 | .publisher(for: NSWorkspace.didTerminateApplicationNotification)
49 | .sink { [weak self] notification in
50 | if let self = self,
51 | let _app = notification.userInfo?[NSWorkspace.applicationUserInfoKey],
52 | let app = _app as? NSRunningApplication,
53 | app.bundleIdentifier == XCODE_BUNDLE_IDENTIFIER {
54 | self.event = XCHookEvent.standby
55 | self.menuBar.updateStatus(event: self.event, isDark: self.isDark)
56 | }
57 | }
58 | .store(in: &cancellables)
59 | }
60 |
61 | @IBAction func openProject(_ sender: Any?) {
62 | if event.path.isEmpty { return }
63 | let projectURL = URL(fileURLWithPath: event.path)
64 | openXcodeProject(with: projectURL)
65 | }
66 |
67 | @IBAction func openHistoricalProject(_ sender: Any?) {
68 | guard let historyMenuItem = sender as? HistoryMenuItem,
69 | let projectURL = historyMenuItem.projectURL
70 | else { return }
71 | openXcodeProject(with: projectURL)
72 | }
73 |
74 | private func openXcodeProject(with url: URL) {
75 | guard FileManager.default.fileExists(atPath: url.path) else {
76 | let projectFile = url.lastPathComponent
77 | let alert = NSAlert()
78 | alert.alertStyle = .warning
79 | alert.messageText = "projectNotOpenMessage".localized
80 | .replacingOccurrences(of: "PROJECT", with: projectFile)
81 | alert.informativeText = "projectNotOpenInformative".localized
82 | alert.runModal()
83 | return
84 | }
85 | let workspace = NSWorkspace.shared
86 | if let xcodeURL = workspace.urlForApplication(withBundleIdentifier: XCODE_BUNDLE_IDENTIFIER) {
87 | let config = NSWorkspace.OpenConfiguration()
88 | workspace.open([url], withApplicationAt: xcodeURL, configuration: config)
89 | }
90 | }
91 |
92 | private func addEvent(_ event: XCHookEvent) {
93 | eventList.append(event)
94 | eventList.sort { $0.timestamp < $1.timestamp }
95 | if MAX_EVENTS < eventList.count {
96 | eventList.removeFirst()
97 | }
98 | var eventHistories = [EventHistory]()
99 | var i: Int = 0
100 | while i < eventList.count - 1 {
101 | let event0 = eventList[i]
102 | let event1 = eventList[i + 1]
103 | if event0.project != event1.project {
104 | i += 1
105 | continue
106 | }
107 | let eventType: EventType
108 | switch (event0.status, event1.status) {
109 | case (.buildStart, .buildSucceeds):
110 | eventType = .buildSucceeded
111 | case (.buildStart, .buildFails):
112 | eventType = .buildFailed
113 | case (.testingStart, .testingSucceeds):
114 | eventType = .testSucceeded
115 | case (.testingStart, .testingFails):
116 | eventType = .testFailed
117 | default:
118 | i += 1
119 | continue
120 | }
121 | let elapsedTime = event1.timestamp - event0.timestamp
122 | let projectURL = event0.path.isEmpty ? nil : URL(fileURLWithPath: event0.path)
123 | eventHistories.append(EventHistory(project: event0.project,
124 | eventType: eventType,
125 | elapsedTime: elapsedTime,
126 | projectURL: projectURL))
127 | i += 2
128 | }
129 | menuBar.updateEventHistories(eventHistories.reversed(), self)
130 | }
131 | }
132 |
133 | extension MenuBarModel: NSMenuItemValidation {
134 | func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
135 | if menuItem.action == #selector(openProject(_:)) {
136 | return !event.path.isEmpty
137 | }
138 | return true
139 | }
140 | }
141 |
--------------------------------------------------------------------------------
/XCMonitor/XCMonitor.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/XCMonitor/XCMonitorApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // XCMonitorApp.swift
3 | // XCMonitor
4 | //
5 | // Created by Takuto Nakamura on 2022/06/11.
6 | //
7 |
8 | import SwiftUI
9 |
10 | @main
11 | struct XCMonitorApp: App {
12 | @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate
13 |
14 | var body: some Scene {
15 | Settings {
16 | SettingsView()
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/XCMonitor/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | Localizable.strings
3 | XCMonitor
4 |
5 | Created by Takuto Nakamura on 2022/05/01.
6 |
7 | */
8 |
9 | // MenuBar
10 | "noProject" = "No Project";
11 | "showProject" = "Show “PROJECT” Project on Xcode";
12 | "empty" = "Empty";
13 | "eventHistory" = "Event History";
14 | "preferences" = "Preferences…";
15 | "aboutApp" = "About XCMonitor";
16 | "terminateApp" = "Quit XCMonitor";
17 |
18 | // Alert
19 | "plistNotFoundTitle" = "Xcode.plist Not Found";
20 | "plistNotFoundMessage" = "XCMonitor cannot be used unless Xcode.app is installed and accessible.";
21 |
22 | "xcodeIsRunningTitle" = "Xcode.app Is Running";
23 | "xcodeIsRunningMessage" = "This operation cannot be performed while Xcode.app is running. Please quit Xcode.app.";
24 |
25 | "xchookConfirmTitle" = "Confirmation";
26 | "xchookConfirmMessage" = "Enabling XCHook will overwrite scripts already set in Xcode Behaviors.";
27 | "xchookConfirmEnable" = "Enable";
28 | "xchookConfirmCancel" = "Cancel";
29 |
30 | "projectNotOpenMessage" = "“PROJECT” Could Not Open";
31 | "projectNotOpenInformative" = "The file path may have changed or the project file may have been deleted.";
32 |
33 | // Preferences
34 | "permission" = "XCMonitor requires the permission of Full Disk Access.";
35 | "openSystemPreferences" = "Open System Preferences";
36 | "general" = "General";
37 | "enableScripts" = "Enable scripts to hook Xcode events.";
38 | "startup:" = "Startup:";
39 | "launchAtLogin" = "Launch XCMonitor automatically at login.";
40 |
--------------------------------------------------------------------------------
/XCMonitor/ja.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | Localizable.strings
3 | XCMonitor
4 |
5 | Created by Takuto Nakamura on 2022/05/01.
6 |
7 | */
8 |
9 | // MenuBar
10 | "noProject" = "プロジェクトなし";
11 | "showProject" = "プロジェクト“PROJECT”をXcodeで開く";
12 | "empty" = "ヒストリーなし";
13 | "eventHistory" = "イベント履歴";
14 | "preferences" = "環境設定…";
15 | "aboutApp" = "XCMonitorについて";
16 | "terminateApp" = "XCMonitorを終了";
17 |
18 | // Alert
19 | "plistNotFoundTitle" = "Xcode.plistが見つかりませんでした。";
20 | "plistNotFoundMessage" = "XCMonitorはXocde.appがインストールされ、アクセス可能な状態でないと使用できません。";
21 |
22 | "xcodeIsRunningTitle" = "Xcode.appが起動中です。";
23 | "xcodeIsRunningMessage" = "Xcode.appが起動している間はこの操作を行うことはできません。Xcode.appを終了してください。";
24 |
25 | "xchookConfirmTitle" = "確認事項";
26 | "xchookConfirmMessage" = "XCHookを有効にすると、Xcode Behaviorsですでに設定されているスクリプトが上書きされます。";
27 | "xchookConfirmEnable" = "有効にする";
28 | "xchookConfirmCancel" = "キャンセル";
29 |
30 | "projectNotOpenMessage" = "“PROJECT”が開けませんでした。";
31 | "projectNotOpenInformative" = "ファイルパスが変更されたか、プロジェクトファイルが削除された可能性があります。";
32 |
33 | // Preferences
34 | "permission" = "XCMonitorを利用するにはフルディスクアクセスの権限が必要です。";
35 | "openSystemPreferences" = "システム環境設定を開く";
36 | "general" = "一般";
37 | "enableScripts" = "Xcodeのイベントをフックするスクリプトを有効にする。";
38 | "startup:" = "起動:";
39 | "launchAtLogin" = "ログイン時にXCMonitorを自動的に起動する。";
40 |
--------------------------------------------------------------------------------
/XCMonitorLauncher/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // XCMonitorLauncher
4 | //
5 | // Created by Takuto Nakamura on 2022/05/26.
6 | //
7 |
8 | import Cocoa
9 |
10 | class AppDelegate: NSObject, NSApplicationDelegate {
11 | func applicationDidFinishLaunching(_ aNotification: Notification) {
12 | let mainAppId = "com.kyome.XCMonitor"
13 | let workspace = NSWorkspace.shared
14 | let isRunning = workspace.runningApplications.contains { app in
15 | app.bundleIdentifier == mainAppId
16 | }
17 | if !isRunning, let url = workspace.urlForApplication(withBundleIdentifier: mainAppId) {
18 | let config = NSWorkspace.OpenConfiguration()
19 | NSWorkspace.shared.openApplication(at: url, configuration: config) { _, _ in
20 | DispatchQueue.main.async {
21 | NSApp.terminate(nil)
22 | }
23 | }
24 | } else {
25 | NSApp.terminate(nil)
26 | }
27 | }
28 |
29 | func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {
30 | return true
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/XCMonitorLauncher/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LSBackgroundOnly
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/XCMonitorLauncher/XCMonitorLauncher.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/XCMonitorLauncher/main.swift:
--------------------------------------------------------------------------------
1 | //
2 | // main.swift
3 | // XCMonitorLauncher
4 | //
5 | // Created by Takuto Nakamura on 2022/05/26.
6 | //
7 |
8 | import Cocoa
9 |
10 | let delegate = AppDelegate()
11 | NSApplication.shared.delegate = delegate
12 | _ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)
13 |
--------------------------------------------------------------------------------