From 5c67c1928cd56bf346a9399501d42df46927a4f9 Mon Sep 17 00:00:00 2001 From: "Takuto NAKAMURA (Kyome)" Date: Fri, 19 May 2023 18:33:09 +0900 Subject: [PATCH] Update for Xcode14.3 --- Menubar RunCat.xcodeproj/project.pbxproj | 52 ++--- .../UserInterfaceState.xcuserstate | Bin 36483 -> 39518 bytes Menubar RunCat/AppDelegate.swift | 184 +++++++++++------- Menubar RunCat/Assets.xcassets/Contents.json | 6 +- .../cat_page0.imageset/Contents.json | 13 +- .../cat_page1.imageset/Contents.json | 13 +- .../cat_page2.imageset/Contents.json | 13 +- .../cat_page3.imageset/Contents.json | 13 +- .../cat_page4.imageset/Contents.json | 13 +- Menubar RunCat/Base.lproj/Main.storyboard | 67 ------- Menubar RunCat/CPU.swift | 35 ++-- Menubar RunCat/Info.plist | 32 +-- Menubar RunCat/main.swift | 13 ++ README | 1 - 14 files changed, 194 insertions(+), 261 deletions(-) delete mode 100644 Menubar RunCat/Base.lproj/Main.storyboard create mode 100644 Menubar RunCat/main.swift delete mode 100644 README diff --git a/Menubar RunCat.xcodeproj/project.pbxproj b/Menubar RunCat.xcodeproj/project.pbxproj index aac83e8..7705874 100644 --- a/Menubar RunCat.xcodeproj/project.pbxproj +++ b/Menubar RunCat.xcodeproj/project.pbxproj @@ -3,21 +3,21 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 56; objects = { /* Begin PBXBuildFile section */ + 1C0ADF322A175F0B00867AB3 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C0ADF312A175F0B00867AB3 /* main.swift */; }; 1CEF10A022F922DB00DAD355 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CEF109F22F922DB00DAD355 /* AppDelegate.swift */; }; 1CEF10A422F922DD00DAD355 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1CEF10A322F922DD00DAD355 /* Assets.xcassets */; }; - 1CEF10A722F922DD00DAD355 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1CEF10A522F922DD00DAD355 /* Main.storyboard */; }; 1CEF10B022F9342600DAD355 /* CPU.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CEF10AF22F9342600DAD355 /* CPU.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 1C0ADF312A175F0B00867AB3 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 1CEF109C22F922DB00DAD355 /* Menubar RunCat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Menubar RunCat.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 1CEF109F22F922DB00DAD355 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1CEF10A322F922DD00DAD355 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 1CEF10A622F922DD00DAD355 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 1CEF10A822F922DD00DAD355 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1CEF10A922F922DD00DAD355 /* Menubar_RunCat.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Menubar_RunCat.entitlements; sourceTree = ""; }; 1CEF10AF22F9342600DAD355 /* CPU.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPU.swift; sourceTree = ""; }; @@ -53,10 +53,10 @@ 1CEF109E22F922DB00DAD355 /* Menubar RunCat */ = { isa = PBXGroup; children = ( + 1C0ADF312A175F0B00867AB3 /* main.swift */, 1CEF109F22F922DB00DAD355 /* AppDelegate.swift */, 1CEF10AF22F9342600DAD355 /* CPU.swift */, 1CEF10A322F922DD00DAD355 /* Assets.xcassets */, - 1CEF10A522F922DD00DAD355 /* Main.storyboard */, 1CEF10A822F922DD00DAD355 /* Info.plist */, 1CEF10A922F922DD00DAD355 /* Menubar_RunCat.entitlements */, ); @@ -89,8 +89,9 @@ 1CEF109422F922DB00DAD355 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1030; - LastUpgradeCheck = 1200; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = "Takuto Nakamura"; TargetAttributes = { 1CEF109B22F922DB00DAD355 = { @@ -99,7 +100,7 @@ }; }; buildConfigurationList = 1CEF109722F922DB00DAD355 /* Build configuration list for PBXProject "Menubar RunCat" */; - compatibilityVersion = "Xcode 9.3"; + compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -122,7 +123,6 @@ buildActionMask = 2147483647; files = ( 1CEF10A422F922DD00DAD355 /* Assets.xcassets in Resources */, - 1CEF10A722F922DD00DAD355 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -135,22 +135,12 @@ files = ( 1CEF10B022F9342600DAD355 /* CPU.swift in Sources */, 1CEF10A022F922DB00DAD355 /* AppDelegate.swift in Sources */, + 1C0ADF322A175F0B00867AB3 /* main.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXVariantGroup section */ - 1CEF10A522F922DD00DAD355 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 1CEF10A622F922DD00DAD355 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ 1CEF10AA22F922DD00DAD355 /* Debug */ = { isa = XCBuildConfiguration; @@ -187,6 +177,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -204,7 +195,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.13; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -249,6 +240,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -260,7 +252,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.13; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; @@ -275,15 +267,23 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Menubar RunCat/Menubar_RunCat.entitlements"; CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1.0.0; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = VJ5N2X84K8; + GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Menubar RunCat/Info.plist"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_LSUIElement = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2019 Takuto Nakamura. All rights reserved."; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "com.kyome.menubar-runcat"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -296,15 +296,23 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "Menubar RunCat/Menubar_RunCat.entitlements"; CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1.0.0; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = VJ5N2X84K8; + GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Menubar RunCat/Info.plist"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_LSUIElement = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2019 Takuto Nakamura. All rights reserved."; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.12; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "com.kyome.menubar-runcat"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/Menubar RunCat.xcodeproj/project.xcworkspace/xcuserdata/takuto.xcuserdatad/UserInterfaceState.xcuserstate b/Menubar RunCat.xcodeproj/project.xcworkspace/xcuserdata/takuto.xcuserdatad/UserInterfaceState.xcuserstate index 320d1c863795a46409456037793e2f30a7e92c98..9783433a809fa28cf20bb7926f7a6fb316482ad7 100644 GIT binary patch literal 39518 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 VufGXyt5(0=4hMcGx-FdM{{!+Wu5|za diff --git a/Menubar RunCat/AppDelegate.swift b/Menubar RunCat/AppDelegate.swift index 3c9b609..c55d781 100644 --- a/Menubar RunCat/AppDelegate.swift +++ b/Menubar RunCat/AppDelegate.swift @@ -1,95 +1,129 @@ -// -// AppDelegate.swift -// Menubar RunCat -// -// Created by Takuto Nakamura on 2019/08/06. -// Copyright © 2019 Takuto Nakamura. All rights reserved. -// +/* + AppDelegate.swift + Menubar RunCat + + Created by Takuto Nakamura on 2019/08/06. + Copyright © 2019 Takuto Nakamura. All rights reserved. +*/ import Cocoa -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { - - @IBOutlet weak var menu: NSMenu! - - private let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) - private let nc = NSWorkspace.shared.notificationCenter - private var frames = [NSImage]() - private var cnt: Int = 0 - private var isRunning: Bool = false +final class AppDelegate: NSObject, NSApplicationDelegate { + private lazy var statusItem: NSStatusItem = { + return NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) + }() + private let menu = NSMenu() + private lazy var frames: [NSImage] = { + return (0 ..< 5).map { n in + let image = NSImage(named: "cat_page\(n)")! + image.size = NSSize(width: 28, height: 18) + return image + } + }() + private var index: Int = 0 private var interval: Double = 1.0 private let cpu = CPU() + private var usage: CPUInfo = CPU.default private var cpuTimer: Timer? = nil - private var usage: (value: Double, description: String) = (0.0, "") + private var runnerTimer: Timer? = nil private var isShowUsage: Bool = false - - func applicationDidFinishLaunching(_ aNotification: Notification) { - for i in (0 ..< 5) { - frames.append(NSImage(imageLiteralResourceName: "cat_page\(i)")) - } - statusItem.menu = menu - statusItem.button?.imagePosition = .imageRight - statusItem.button?.image = frames[cnt] - cnt = (cnt + 1) % frames.count - + + func applicationDidFinishLaunching(_ notification: Notification) { + setupStatusItem() startRunning() } - func applicationWillTerminate(_ aNotification: Notification) { + func applicationWillTerminate(_ notification: Notification) { stopRunning() } - - func setNotifications() { - nc.addObserver(self, selector: #selector(AppDelegate.receiveSleepNote), - name: NSWorkspace.willSleepNotification, object: nil) - nc.addObserver(self, selector: #selector(AppDelegate.receiveWakeNote), - name: NSWorkspace.didWakeNotification, object: nil) - } - - @objc func receiveSleepNote() { - stopRunning() - } - - @objc func receiveWakeNote() { - startRunning() - } - - func startRunning() { - cpuTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true, block: { (t) in - self.usage = self.cpu.usageCPU() - self.interval = 0.02 * (100 - max(0.0, min(99.0, self.usage.value))) / 6 - self.statusItem.button?.title = self.isShowUsage ? self.usage.description : "" - }) - cpuTimer?.fire() - isRunning = true - animate() - } - - func stopRunning() { - isRunning = false - cpuTimer?.invalidate() - } - func animate() { - statusItem.button?.image = frames[cnt] - cnt = (cnt + 1) % frames.count - if !isRunning { return } - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + interval) { - self.animate() - } - } - - @IBAction func toggleShowUsage(_ sender: NSMenuItem) { - isShowUsage = sender.state == .off - sender.state = isShowUsage ? .on : .off + private func updateUsageDescription() { statusItem.button?.title = isShowUsage ? usage.description : "" } - - @IBAction func showAbout(_ sender: Any) { + + @objc func toggleShowUsage(_ sender: NSMenuItem) { + isShowUsage = (sender.state == .off) + sender.state = isShowUsage ? .on : .off + updateUsageDescription() + } + + @objc func openAbout(_ sender: Any?) { NSApp.activate(ignoringOtherApps: true) NSApp.orderFrontStandardAboutPanel(nil) } -} + @objc func terminateApp(_ sender: Any?) { + NSApp.terminate(nil) + } + private func setupStatusItem() { + statusItem.button?.imagePosition = .imageTrailing + statusItem.button?.image = frames.first + if #available(macOS 10.15, *) { + let font = NSFont.monospacedSystemFont(ofSize: 11, weight: .regular) + statusItem.button?.font = font + } else { + let font = NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular) + statusItem.button?.font = font + } + menu.addItem(withTitle: "Show CPU Usage", + action: #selector(toggleShowUsage(_:)), + keyEquivalent: "") + menu.addItem(NSMenuItem.separator()) + menu.addItem(withTitle: "About Menubar RunCat", + action: #selector(openAbout(_:)), + keyEquivalent: "") + menu.addItem(withTitle: "Quit Menubar RunCat", + action: #selector(terminateApp(_:)), + keyEquivalent: "") + statusItem.menu = menu + } + + @objc func receiveSleep(_ notification: NSNotification) { + stopRunning() + } + + @objc func receiveWakeUp(_ notification: NSNotification) { + startRunning() + } + + private func setNotifications() { + NSWorkspace.shared.notificationCenter + .addObserver(self, selector: #selector(receiveSleep(_:)), + name: NSWorkspace.willSleepNotification, + object: nil) + NSWorkspace.shared.notificationCenter + .addObserver(self, selector: #selector(receiveWakeUp(_:)), + name: NSWorkspace.didWakeNotification, + object: nil) + } + + private func updateUsage() { + usage = cpu.currentUsage() + interval = 0.2 / max(1.0, min(20.0, self.usage.value / 5.0)) + updateUsageDescription() + runnerTimer?.invalidate() + runnerTimer = Timer(timeInterval: self.interval, repeats: true, block: { [weak self] _ in + self?.next() + }) + RunLoop.main.add(runnerTimer!, forMode: .common) + } + + private func next() { + index = (index + 1) % frames.count + statusItem.button?.image = frames[index] + } + + private func startRunning() { + cpuTimer = Timer(timeInterval: 5.0, repeats: true, block: { [weak self] _ in + self?.updateUsage() + }) + RunLoop.main.add(cpuTimer!, forMode: .common) + cpuTimer?.fire() + } + + private func stopRunning() { + runnerTimer?.invalidate() + cpuTimer?.invalidate() + } +} diff --git a/Menubar RunCat/Assets.xcassets/Contents.json b/Menubar RunCat/Assets.xcassets/Contents.json index da4a164..73c0059 100644 --- a/Menubar RunCat/Assets.xcassets/Contents.json +++ b/Menubar RunCat/Assets.xcassets/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/Menubar RunCat/Assets.xcassets/cat_page0.imageset/Contents.json b/Menubar RunCat/Assets.xcassets/cat_page0.imageset/Contents.json index 9fcf337..a8bc829 100644 --- a/Menubar RunCat/Assets.xcassets/cat_page0.imageset/Contents.json +++ b/Menubar RunCat/Assets.xcassets/cat_page0.imageset/Contents.json @@ -1,20 +1,15 @@ { "images" : [ { - "idiom" : "mac", - "scale" : "1x" - }, - { - "idiom" : "mac", "filename" : "cat0.png", - "scale" : "2x" + "idiom" : "mac" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/Menubar RunCat/Assets.xcassets/cat_page1.imageset/Contents.json b/Menubar RunCat/Assets.xcassets/cat_page1.imageset/Contents.json index 2bf94cd..b50e0f6 100644 --- a/Menubar RunCat/Assets.xcassets/cat_page1.imageset/Contents.json +++ b/Menubar RunCat/Assets.xcassets/cat_page1.imageset/Contents.json @@ -1,20 +1,15 @@ { "images" : [ { - "idiom" : "mac", - "scale" : "1x" - }, - { - "idiom" : "mac", "filename" : "cat1.png", - "scale" : "2x" + "idiom" : "mac" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/Menubar RunCat/Assets.xcassets/cat_page2.imageset/Contents.json b/Menubar RunCat/Assets.xcassets/cat_page2.imageset/Contents.json index 364dd19..e02e97c 100644 --- a/Menubar RunCat/Assets.xcassets/cat_page2.imageset/Contents.json +++ b/Menubar RunCat/Assets.xcassets/cat_page2.imageset/Contents.json @@ -1,20 +1,15 @@ { "images" : [ { - "idiom" : "mac", - "scale" : "1x" - }, - { - "idiom" : "mac", "filename" : "cat2.png", - "scale" : "2x" + "idiom" : "mac" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/Menubar RunCat/Assets.xcassets/cat_page3.imageset/Contents.json b/Menubar RunCat/Assets.xcassets/cat_page3.imageset/Contents.json index af127ff..d53d294 100644 --- a/Menubar RunCat/Assets.xcassets/cat_page3.imageset/Contents.json +++ b/Menubar RunCat/Assets.xcassets/cat_page3.imageset/Contents.json @@ -1,20 +1,15 @@ { "images" : [ { - "idiom" : "mac", - "scale" : "1x" - }, - { - "idiom" : "mac", "filename" : "cat3.png", - "scale" : "2x" + "idiom" : "mac" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/Menubar RunCat/Assets.xcassets/cat_page4.imageset/Contents.json b/Menubar RunCat/Assets.xcassets/cat_page4.imageset/Contents.json index 1e85fe5..f769f77 100644 --- a/Menubar RunCat/Assets.xcassets/cat_page4.imageset/Contents.json +++ b/Menubar RunCat/Assets.xcassets/cat_page4.imageset/Contents.json @@ -1,20 +1,15 @@ { "images" : [ { - "idiom" : "mac", - "scale" : "1x" - }, - { - "idiom" : "mac", "filename" : "cat4.png", - "scale" : "2x" + "idiom" : "mac" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/Menubar RunCat/Base.lproj/Main.storyboard b/Menubar RunCat/Base.lproj/Main.storyboard deleted file mode 100644 index 4570384..0000000 --- a/Menubar RunCat/Base.lproj/Main.storyboard +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Menubar RunCat/CPU.swift b/Menubar RunCat/CPU.swift index 94b2e4a..210449c 100644 --- a/Menubar RunCat/CPU.swift +++ b/Menubar RunCat/CPU.swift @@ -1,15 +1,18 @@ -// -// CPU.swift -// Menubar RunCat -// -// Created by Takuto Nakamura on 2019/08/06. -// Copyright © 2019 Takuto Nakamura. All rights reserved. -// +/* + CPU.swift + Menubar RunCat + + Created by Takuto Nakamura on 2019/08/06. + Copyright © 2019 Takuto Nakamura. All rights reserved. +*/ import Darwin -public class CPU { - +typealias CPUInfo = (value: Double, description: String) + +final class CPU { + static let `default` = CPUInfo(0.0, " 0.0% ") + private let loadInfoCount: mach_msg_type_number_t! private var loadPrevious = host_cpu_load_info() @@ -20,18 +23,15 @@ public class CPU { private func hostCPULoadInfo() -> host_cpu_load_info { var size: mach_msg_type_number_t = loadInfoCount let hostInfo = host_cpu_load_info_t.allocate(capacity: 1) - let _ = hostInfo.withMemoryRebound(to: integer_t.self, capacity: Int(size)) { (pointer) -> kern_return_t in return host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, pointer, &size) } - // kern_return_t == KERN_SUCCESS let data = hostInfo.move() hostInfo.deallocate() - return data } - public func usageCPU() -> (value: Double, description: String) { + func currentUsage() -> CPUInfo { let load = hostCPULoadInfo() let userDiff = Double(load.cpu_ticks.0 - loadPrevious.cpu_ticks.0) let sysDiff = Double(load.cpu_ticks.1 - loadPrevious.cpu_ticks.1) @@ -42,11 +42,10 @@ public class CPU { let totalTicks = sysDiff + userDiff + idleDiff + niceDiff let sys = 100.0 * sysDiff / totalTicks let user = 100.0 * userDiff / totalTicks + + let value = min(99.9, (10.0 * (sys + user)).rounded() / 10.0) + let description = String(format: "%4.1f%%", value) - let value: Double = round((sys + user) * 10.0) / 10.0 - let description: String = (value >= 100.0) ? "100↑%" : ((value < 10.0 ? " " : "") + String(value)) + "% " - - return (value, description) + return CPUInfo(value, description) } - } diff --git a/Menubar RunCat/Info.plist b/Menubar RunCat/Info.plist index cd774ce..bc11256 100644 --- a/Menubar RunCat/Info.plist +++ b/Menubar RunCat/Info.plist @@ -2,35 +2,7 @@ - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1.0.0 - LSApplicationCategoryType - public.app-category.utilities - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - LSUIElement - - NSHumanReadableCopyright - Copyright © 2019 Takuto Nakamura. All rights reserved. - NSMainStoryboardFile - Main - NSPrincipalClass - NSApplication + ITSAppUsesNonExemptEncryption + diff --git a/Menubar RunCat/main.swift b/Menubar RunCat/main.swift new file mode 100644 index 0000000..50af22d --- /dev/null +++ b/Menubar RunCat/main.swift @@ -0,0 +1,13 @@ +/* + main.swift + Menubar RunCat + + Created by Takuto Nakamura on 2023/05/19. + Copyright © 2023 Takuto Nakamura. All rights reserved. +*/ + +import Cocoa + +let delegate = AppDelegate() +NSApplication.shared.delegate = delegate +_ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv) diff --git a/README b/README deleted file mode 100644 index e965047..0000000 --- a/README +++ /dev/null @@ -1 +0,0 @@ -Hello