diff --git a/InfoPlistPreprocessor.h b/InfoPlistPreprocessor.h index a330714d..9fe2453d 100644 --- a/InfoPlistPreprocessor.h +++ b/InfoPlistPreprocessor.h @@ -9,7 +9,7 @@ #ifndef InfoPlistPreprocessor_h #define InfoPlistPreprocessor_h -#define MM_VERSION 2.1.3 +#define MM_VERSION 2.1.4 #define MM_COPYRIGHT MenuMeters MM_VERSION, by many contributors #endif /* InfoPlistPreprocessor_h */ diff --git a/MenuMeters.xcodeproj/project.pbxproj b/MenuMeters.xcodeproj/project.pbxproj index b480cb5e..30450fc8 100644 --- a/MenuMeters.xcodeproj/project.pbxproj +++ b/MenuMeters.xcodeproj/project.pbxproj @@ -28,7 +28,7 @@ 33883CF723655C9900B8AC14 /* MenuMeterCPUStats.m in Sources */ = {isa = PBXBuildFile; fileRef = D477AAF103D4BB9200A87BC9 /* MenuMeterCPUStats.m */; }; 33883CF823655C9900B8AC14 /* MenuMetersMenuExtraBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 3345DD2E1B6BEFDE003843FC /* MenuMetersMenuExtraBase.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 33883CF923655C9900B8AC14 /* MenuMeterUptime.m in Sources */ = {isa = PBXBuildFile; fileRef = D477AAF503D4BB9D00A87BC9 /* MenuMeterUptime.m */; }; - 33883CFA23655C9900B8AC14 /* smc_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = F75EBE2F235B6F3600876CF7 /* smc_reader.c */; }; + 33883CFA23655C9900B8AC14 /* smc_reader.m in Sources */ = {isa = PBXBuildFile; fileRef = F75EBE2F235B6F3600876CF7 /* smc_reader.m */; }; 33883CFB23655C9900B8AC14 /* MenuMeterCPUTopProcesses.m in Sources */ = {isa = PBXBuildFile; fileRef = D602BB90207F9561004984C1 /* MenuMeterCPUTopProcesses.m */; }; 33883CFC23655C9900B8AC14 /* MenuMeterMemStats.m in Sources */ = {isa = PBXBuildFile; fileRef = D45F12E203D48A1C00A87BC9 /* MenuMeterMemStats.m */; }; 33883CFD23655C9900B8AC14 /* MenuMeterDiskSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = D42EC96503D49AF700A87BC9 /* MenuMeterDiskSpace.m */; }; @@ -90,7 +90,7 @@ 6349C11124BB733300C6FC99 /* MenuMeterCPUStats.m in Sources */ = {isa = PBXBuildFile; fileRef = D477AAF103D4BB9200A87BC9 /* MenuMeterCPUStats.m */; }; 6349C11224BB733300C6FC99 /* MenuMetersMenuExtraBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 3345DD2E1B6BEFDE003843FC /* MenuMetersMenuExtraBase.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 6349C11324BB733300C6FC99 /* MenuMeterUptime.m in Sources */ = {isa = PBXBuildFile; fileRef = D477AAF503D4BB9D00A87BC9 /* MenuMeterUptime.m */; }; - 6349C11424BB733300C6FC99 /* smc_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = F75EBE2F235B6F3600876CF7 /* smc_reader.c */; }; + 6349C11424BB733300C6FC99 /* smc_reader.m in Sources */ = {isa = PBXBuildFile; fileRef = F75EBE2F235B6F3600876CF7 /* smc_reader.m */; }; 6349C11524BB733300C6FC99 /* MenuMeterCPUTopProcesses.m in Sources */ = {isa = PBXBuildFile; fileRef = D602BB90207F9561004984C1 /* MenuMeterCPUTopProcesses.m */; }; 6349C11624BB733300C6FC99 /* MenuMeterMemStats.m in Sources */ = {isa = PBXBuildFile; fileRef = D45F12E203D48A1C00A87BC9 /* MenuMeterMemStats.m */; }; 6349C11724BB733300C6FC99 /* MenuMeterDiskSpace.m in Sources */ = {isa = PBXBuildFile; fileRef = D42EC96503D49AF700A87BC9 /* MenuMeterDiskSpace.m */; }; @@ -294,7 +294,7 @@ D602BB8F207F9561004984C1 /* MenuMeterCPUTopProcesses.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuMeterCPUTopProcesses.h; path = MenuExtras/MenuMeterCPU/MenuMeterCPUTopProcesses.h; sourceTree = ""; }; D602BB90207F9561004984C1 /* MenuMeterCPUTopProcesses.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuMeterCPUTopProcesses.m; path = MenuExtras/MenuMeterCPU/MenuMeterCPUTopProcesses.m; sourceTree = ""; }; F75EBE2E235B6F3600876CF7 /* smc_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smc_reader.h; sourceTree = ""; }; - F75EBE2F235B6F3600876CF7 /* smc_reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = smc_reader.c; sourceTree = ""; }; + F75EBE2F235B6F3600876CF7 /* smc_reader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = smc_reader.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -587,7 +587,7 @@ isa = PBXGroup; children = ( F75EBE2E235B6F3600876CF7 /* smc_reader.h */, - F75EBE2F235B6F3600876CF7 /* smc_reader.c */, + F75EBE2F235B6F3600876CF7 /* smc_reader.m */, 3325978B25BE7DB10070CE37 /* applesilicon_hardware_reader.m */, 3325978F25BE7DCA0070CE37 /* applesilicon_hardware_reader.h */, 3391A11625C66B5F00B83705 /* TemperatureReader.h */, @@ -831,7 +831,7 @@ 33883CF823655C9900B8AC14 /* MenuMetersMenuExtraBase.m in Sources */, 3325978C25BE7DB10070CE37 /* applesilicon_hardware_reader.m in Sources */, 33883CF923655C9900B8AC14 /* MenuMeterUptime.m in Sources */, - 33883CFA23655C9900B8AC14 /* smc_reader.c in Sources */, + 33883CFA23655C9900B8AC14 /* smc_reader.m in Sources */, 33883CFB23655C9900B8AC14 /* MenuMeterCPUTopProcesses.m in Sources */, 33883CFC23655C9900B8AC14 /* MenuMeterMemStats.m in Sources */, 33883CFD23655C9900B8AC14 /* MenuMeterDiskSpace.m in Sources */, @@ -863,7 +863,7 @@ 6349C11224BB733300C6FC99 /* MenuMetersMenuExtraBase.m in Sources */, 3325979325BE7DD00070CE37 /* applesilicon_hardware_reader.m in Sources */, 6349C11324BB733300C6FC99 /* MenuMeterUptime.m in Sources */, - 6349C11424BB733300C6FC99 /* smc_reader.c in Sources */, + 6349C11424BB733300C6FC99 /* smc_reader.m in Sources */, 6349C11524BB733300C6FC99 /* MenuMeterCPUTopProcesses.m in Sources */, 6349C11624BB733300C6FC99 /* MenuMeterMemStats.m in Sources */, 6349C11724BB733300C6FC99 /* MenuMeterDiskSpace.m in Sources */, diff --git a/PrefPane/v2.0.8alert.rtf b/PrefPane/v2.0.8alert.rtf index 9c9337da..45252ab9 100644 --- a/PrefPane/v2.0.8alert.rtf +++ b/PrefPane/v2.0.8alert.rtf @@ -1,4 +1,4 @@ -{\rtf1\ansi\ansicpg932\cocoartf2577 +{\rtf1\ansi\ansicpg932\cocoartf2513 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Optima-Regular;\f1\fswiss\fcharset0 Optima-Bold;\f2\fnil\fcharset0 LucidaGrande; } {\colortbl;\red255\green255\blue255;} @@ -7,9 +7,9 @@ {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} {\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3} {\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid301\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid4} -{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid402\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid5} +{\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid5} {\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid501\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid502\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid6} -{\list\listtemplateid7\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid601\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid7} +{\list\listtemplateid7\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid601\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid602\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid7} {\list\listtemplateid8\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid701\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid8} {\list\listtemplateid9\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid801\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid9} {\list\listtemplateid10\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid901\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid10} @@ -18,8 +18,9 @@ {\list\listtemplateid13\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid13} {\list\listtemplateid14\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1301\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid14} {\list\listtemplateid15\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid15} -{\list\listtemplateid16\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1501\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid16}} -{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}{\listoverride\listid8\listoverridecount0\ls8}{\listoverride\listid9\listoverridecount0\ls9}{\listoverride\listid10\listoverridecount0\ls10}{\listoverride\listid11\listoverridecount0\ls11}{\listoverride\listid12\listoverridecount0\ls12}{\listoverride\listid13\listoverridecount0\ls13}{\listoverride\listid14\listoverridecount0\ls14}{\listoverride\listid15\listoverridecount0\ls15}{\listoverride\listid16\listoverridecount0\ls16}} +{\list\listtemplateid16\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1501\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid16} +{\list\listtemplateid17\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1601\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid17}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}{\listoverride\listid8\listoverridecount0\ls8}{\listoverride\listid9\listoverridecount0\ls9}{\listoverride\listid10\listoverridecount0\ls10}{\listoverride\listid11\listoverridecount0\ls11}{\listoverride\listid12\listoverridecount0\ls12}{\listoverride\listid13\listoverridecount0\ls13}{\listoverride\listid14\listoverridecount0\ls14}{\listoverride\listid15\listoverridecount0\ls15}{\listoverride\listid16\listoverridecount0\ls16}{\listoverride\listid17\listoverridecount0\ls17}} \margl1440\margr1440\vieww10900\viewh8400\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 @@ -36,44 +37,49 @@ \ls3\ilvl0\cf0 {\listtext \uc0\u8226 }You can also write to {\field{\*\fldinst{HYPERLINK "mailto:yuji.tachikawa@icloud.com"}}{\fldrslt yuji.tachikawa@icloud.com}}, but I do appreciate if you could report on GitHub. This way, other users can find which bugs were already reported. You can also get notified if there is any new information available.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ +New in v2.1.4:\ +\pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 +\ls4\ilvl0\cf0 {\listtext \uc0\u8226 } The temperature sensor to be used is now selectable.\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ New in v2.1.3:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls4\ilvl0\cf0 {\listtext \uc0\u8226 }The CPU temperature is now displayed also on Apple Silicon macs.\ +\ls5\ilvl0\cf0 {\listtext \uc0\u8226 }The CPU temperature is now displayed also on Apple Silicon macs.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.1.2:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls5\ilvl0\cf0 {\listtext \uc0\u8226 }The font size of CPU temperature now follows the font size of the CPU meter.\ +\ls6\ilvl0\cf0 {\listtext \uc0\u8226 }The font size of CPU temperature now follows the font size of the CPU meter.\ {\listtext \uc0\u8226 }The CPU meter pull-down menu now shows the thermal power limit status.\ {\listtext \uc0\u8226 }The memory pressure mode of the memory meter now reports the value as shown in the system Activity Monitor.\ {\listtext \uc0\u8226 }The net meter now reports the Airport speed as shown in the system WiFi menu.\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls5\ilvl1\cf0 {\listtext \uc0\u8226 }You can now reset traffic totals in the net meter.\ +\ls6\ilvl1\cf0 {\listtext \uc0\u8226 }You can now reset traffic totals in the net meter.\ {\listtext \uc0\u8226 }MenuMeters show CPU frequency on Apple Silicon.\ {\listtext \uc0\u8226 }Other minor bug fixes. If you have opened a GitHub issue, please have a look.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.1.1:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls6\ilvl0\cf0 {\listtext \uc0\u8226 }A bug in the net meter on Big Sur was fixed, where it sometimes showed 0 bytes/sec unless the menu was brought up by clicking it.\ +\ls7\ilvl0\cf0 {\listtext \uc0\u8226 }A bug in the net meter on Big Sur was fixed, where it sometimes showed 0 bytes/sec unless the menu was brought up by clicking it.\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls6\ilvl1\cf0 {\listtext \uc0\u8226 }Started preliminary Apple Silicon support. If the app crashes, please open it in Rosetta.\ +\ls7\ilvl1\cf0 {\listtext \uc0\u8226 }Started preliminary Apple Silicon support. If the app crashes, please open it in Rosetta.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.1.0:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls7\ilvl0\cf0 {\listtext \uc0\u8226 }The order of "meters" within the menu bar is properly preserved on Big Sur.\ +\ls8\ilvl0\cf0 {\listtext \uc0\u8226 }The order of "meters" within the menu bar is properly preserved on Big Sur.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.9:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls8\ilvl0\cf0 {\listtext \uc0\u8226 }You can finally select colors with transparency.\ +\ls9\ilvl0\cf0 {\listtext \uc0\u8226 }You can finally select colors with transparency.\ {\listtext \uc0\u8226 }The auto-updater now sends basic system info such as macOS version, cpu type, etc. For details, see {\field{\*\fldinst{HYPERLINK "https://sparkle-project.org/documentation/system-profiling/"}}{\fldrslt https://sparkle-project.org/documentation/system-profiling/}}.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.8:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls9\ilvl0\cf0 {\listtext \uc0\u8226 }You can now tint the colors toward black/white if the system is in the light/dark mode, using the slider below.\ +\ls10\ilvl0\cf0 {\listtext \uc0\u8226 }You can now tint the colors toward black/white if the system is in the light/dark mode, using the slider below.\ {\listtext \uc0\u8226 }Activity Monitor can now be opened from any MenuMeter. \ {\listtext \uc0\u8226 }You can also let MenuMeters to open specific panes of Activity Monitor, by enabling the checkbox below this about box. For this feature, MenuMeters use two techniques (accessibility and automation) which require your approval, so \f1\b two alerts will be shown @@ -83,40 +89,40 @@ New in v2.0.8:\ \f2 \uc0\u8984 \f0 -dragging below the menu bar.\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls10\ilvl0\cf0 {\listtext \uc0\u8226 }The path of the swap file is now correctly identified again.\ +\ls11\ilvl0\cf0 {\listtext \uc0\u8226 }The path of the swap file is now correctly identified again.\ {\listtext \uc0\u8226 }The auto-update-check interval is now correctly shown in the UI. In the past, it was respected but not correctly reflected in the UI after relaunch.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.7:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls11\ilvl0\cf0 {\listtext \uc0\u8226 }CPU display modes are now configured in a saner way. You can now only show the CPU temperature, or even just a static label.\ +\ls12\ilvl0\cf0 {\listtext \uc0\u8226 }CPU display modes are now configured in a saner way. You can now only show the CPU temperature, or even just a static label.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.6:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls12\ilvl0\cf0 {\listtext \uc0\u8226 }Due to popular demand, you can now choose the interval to check the update. Also includes a fix for a dark mode bug.\ +\ls13\ilvl0\cf0 {\listtext \uc0\u8226 }Due to popular demand, you can now choose the interval to check the update. Also includes a fix for a dark mode bug.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.5:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls13\ilvl0\cf0 {\listtext \uc0\u8226 }Fix for a CPU percentage bug, and a new Finnish localization.\ +\ls14\ilvl0\cf0 {\listtext \uc0\u8226 }Fix for a CPU percentage bug, and a new Finnish localization.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.4:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls14\ilvl0\cf0 {\listtext \uc0\u8226 }CPU temperature can now be shown in Fahrenheit, and not just in Celsius.\ +\ls15\ilvl0\cf0 {\listtext \uc0\u8226 }CPU temperature can now be shown in Fahrenheit, and not just in Celsius.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.3:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls15\ilvl0\cf0 {\listtext \uc0\u8226 }Due to popular demand, +\ls16\ilvl0\cf0 {\listtext \uc0\u8226 }Due to popular demand, \f1\b there is a new option to show physical cores only \f0\b0 . In fact, basically the same functionality was there for a long time, under a different name, in a place difficult to find. Please go to the CPU meter pref pane to turn it on.\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \cf0 \ New in v2.0.1:\ \pard\tx220\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\fi-720\pardirnatural\partightenfactor0 -\ls16\ilvl0\cf0 {\listtext \uc0\u8226 } +\ls17\ilvl0\cf0 {\listtext \uc0\u8226 } \f1\b New high-resolution icon \f0\b0 was provided by Emanuel Batalha .\ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 diff --git a/hardware_reader/TemperatureReader.m b/hardware_reader/TemperatureReader.m index f7a38d4d..c018d01d 100644 --- a/hardware_reader/TemperatureReader.m +++ b/hardware_reader/TemperatureReader.m @@ -59,12 +59,31 @@ +(NSString*)defaultSensorRealWork return candidate; if([[self sensorNames] containsObject:candidate]) return candidate; + for(NSString*sensor in [self sensorNames]){ + if([sensor hasPrefix:@"TC"]) + return sensor; + } return [self sensorNames][0]; } +(NSString*)displayNameForSensor:(NSString*)name { #if TARGET_CPU_X86_64 - return name; + static NSMutableDictionary*dict=nil; + if(!dict){ + dict=[NSMutableDictionary dictionary]; + NSDictionary*rawDict=SMCHumanReadableDescriptions(); + for(NSString*key in [self sensorNames]){ + NSString*s=rawDict[key]; + if(s){ + s=[s stringByReplacingOccurrencesOfString:@"(DegC)" withString:@""]; + s=[s stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"(%@)",key] withString:@""]; + dict[key]=[NSString stringWithFormat:@"%@: %@",key,s]; + }else{ + dict[key]=key; + } + } + } + return dict[name]; #elif TARGET_CPU_ARM64 return name; #endif diff --git a/hardware_reader/smc_reader.c b/hardware_reader/smc_reader.c deleted file mode 100644 index 663eb513..00000000 --- a/hardware_reader/smc_reader.c +++ /dev/null @@ -1,131 +0,0 @@ -#include -#include "smc_reader.h" - -static io_connect_t conn; - -kern_return_t SMCOpen() -{ - kern_return_t result; - io_iterator_t iterator; - io_object_t device; - - result = IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching(IO_SERVICE_NAME), &iterator); - if (result != kIOReturnSuccess) - { - printf("Error: IOServiceGetMatchingServices() = %08x\n", result); - return result; - } - - device = IOIteratorNext(iterator); - IOObjectRelease(iterator); - if (!device) - { - printf("Error: no SMC found\n"); - return kIOReturnNoDevice; - } - - result = IOServiceOpen(device, mach_task_self(), 0, &conn); - IOObjectRelease(device); - if (result != kIOReturnSuccess) - { - printf("Error: IOServiceOpen() = %08x\n", result); - return result; - } - - return kIOReturnSuccess; -} - -kern_return_t SMCClose() -{ - return IOServiceClose(conn); -} - - -kern_return_t SMCCall(int index, SMCKeyData *inputStructure, SMCKeyData *outputStructure) -{ - size_t structureInputSize; - size_t structureOutputSize; - - structureInputSize = sizeof(SMCKeyData); - structureOutputSize = sizeof(SMCKeyData); - - return IOConnectCallStructMethod(conn, index, - inputStructure, structureInputSize, - outputStructure, &structureOutputSize); -} - -kern_return_t SMCReadKey(SMCCode key, SMCKeyValue *val) -{ - kern_return_t result; - SMCKeyData inputStructure = {}; - SMCKeyData outputStructure = {}; - - inputStructure.key = key; - inputStructure.data8 = SMC_CMD_READ_KEYINFO; - - result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); - if (result != kIOReturnSuccess) - { - return result; - } - if (outputStructure.result != SMC_CALL_RESULT_SUCCESS) - { - return kIOReturnError; - } - - val->info = outputStructure.keyInfo; - - inputStructure.keyInfo.dataSize = val->info.dataSize; - inputStructure.data8 = SMC_CMD_READ_BYTES; - - result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); - if (result != kIOReturnSuccess) - { - return result; - } - if (outputStructure.result != SMC_CALL_RESULT_SUCCESS) - { - return kIOReturnError; - } - - memcpy(val->key.code, key.code, sizeof(val->key.code)); - memcpy(val->bytes, outputStructure.bytes, sizeof(outputStructure.bytes)); - - return kIOReturnSuccess; -} - -kern_return_t SMCReadKeysCount(UInt32 *count) -{ - kern_return_t result; - SMCKeyValue val = {}; - result = SMCReadKey(toSMCCode("#KEY"), &val); - if (result == kIOReturnSuccess && val.info.dataType.type == SMC_DATATYPE_UINT32.type) - { - *count = UI32_TO_UINT32(val.bytes); - } - return result; -} - -kern_return_t SMCReadKeyAtIndex(UInt32 index, SMCKeyValue *val) -{ - kern_return_t result; - SMCKeyData inputStructure = {}; - SMCKeyData outputStructure = {}; - - inputStructure.data32 = index; - inputStructure.data8 = SMC_CMD_READ_INDEX; - - result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); - if (result != kIOReturnSuccess) - { - return result; - } - - if (outputStructure.result != SMC_CALL_RESULT_SUCCESS) - { - return kIOReturnError; - } - - return SMCReadKey(outputStructure.key, val); -} - diff --git a/hardware_reader/smc_reader.h b/hardware_reader/smc_reader.h index 6d96a34f..f2438183 100644 --- a/hardware_reader/smc_reader.h +++ b/hardware_reader/smc_reader.h @@ -104,4 +104,6 @@ kern_return_t SMCReadKey(SMCCode key, SMCKeyValue *val); kern_return_t SMCReadKeysCount(UInt32 *count); kern_return_t SMCReadKeyAtIndex(UInt32 index, SMCKeyValue *val); +NSDictionary* SMCHumanReadableDescriptions(void); + #endif /* smc_reader_h */ diff --git a/hardware_reader/smc_reader.m b/hardware_reader/smc_reader.m new file mode 100644 index 00000000..472379e4 --- /dev/null +++ b/hardware_reader/smc_reader.m @@ -0,0 +1,220 @@ +#include +#include "smc_reader.h" + +static io_connect_t conn; + +kern_return_t SMCOpen() +{ + kern_return_t result; + io_iterator_t iterator; + io_object_t device; + + result = IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching(IO_SERVICE_NAME), &iterator); + if (result != kIOReturnSuccess) + { + printf("Error: IOServiceGetMatchingServices() = %08x\n", result); + return result; + } + + device = IOIteratorNext(iterator); + IOObjectRelease(iterator); + if (!device) + { + printf("Error: no SMC found\n"); + return kIOReturnNoDevice; + } + + result = IOServiceOpen(device, mach_task_self(), 0, &conn); + IOObjectRelease(device); + if (result != kIOReturnSuccess) + { + printf("Error: IOServiceOpen() = %08x\n", result); + return result; + } + + return kIOReturnSuccess; +} + +kern_return_t SMCClose() +{ + return IOServiceClose(conn); +} + + +kern_return_t SMCCall(int index, SMCKeyData *inputStructure, SMCKeyData *outputStructure) +{ + size_t structureInputSize; + size_t structureOutputSize; + + structureInputSize = sizeof(SMCKeyData); + structureOutputSize = sizeof(SMCKeyData); + + return IOConnectCallStructMethod(conn, index, + inputStructure, structureInputSize, + outputStructure, &structureOutputSize); +} + +kern_return_t SMCReadKey(SMCCode key, SMCKeyValue *val) +{ + kern_return_t result; + SMCKeyData inputStructure = {}; + SMCKeyData outputStructure = {}; + + inputStructure.key = key; + inputStructure.data8 = SMC_CMD_READ_KEYINFO; + + result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); + if (result != kIOReturnSuccess) + { + return result; + } + if (outputStructure.result != SMC_CALL_RESULT_SUCCESS) + { + return kIOReturnError; + } + + val->info = outputStructure.keyInfo; + + inputStructure.keyInfo.dataSize = val->info.dataSize; + inputStructure.data8 = SMC_CMD_READ_BYTES; + + result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); + if (result != kIOReturnSuccess) + { + return result; + } + if (outputStructure.result != SMC_CALL_RESULT_SUCCESS) + { + return kIOReturnError; + } + + memcpy(val->key.code, key.code, sizeof(val->key.code)); + memcpy(val->bytes, outputStructure.bytes, sizeof(outputStructure.bytes)); + + return kIOReturnSuccess; +} + +kern_return_t SMCReadKeysCount(UInt32 *count) +{ + kern_return_t result; + SMCKeyValue val = {}; + result = SMCReadKey(toSMCCode("#KEY"), &val); + if (result == kIOReturnSuccess && val.info.dataType.type == SMC_DATATYPE_UINT32.type) + { + *count = UI32_TO_UINT32(val.bytes); + } + return result; +} + +kern_return_t SMCReadKeyAtIndex(UInt32 index, SMCKeyValue *val) +{ + kern_return_t result; + SMCKeyData inputStructure = {}; + SMCKeyData outputStructure = {}; + + inputStructure.data32 = index; + inputStructure.data8 = SMC_CMD_READ_INDEX; + + result = SMCCall(KERNEL_INDEX_SMC, &inputStructure, &outputStructure); + if (result != kIOReturnSuccess) + { + return result; + } + + if (outputStructure.result != SMC_CALL_RESULT_SUCCESS) + { + return kIOReturnError; + } + + return SMCReadKey(outputStructure.key, val); +} + +// modified from smc_dump_lib_keys +// in https://github.com/acidanthera/VirtualSMC/blob/master/Tools/smcread/smcread.c +// whose license is BSD 3-Clause "New" or "Revised" License +// https://github.com/acidanthera/VirtualSMC/blob/master/LICENSE.txt + +#include + +struct PlatformKeyDescriptions { + char key[4]; + uint8_t index; + char description[256]; + uint8_t len; + uint16_t pad1; + char type[4]; + uint32_t pad2; /* added in 10.13.4 */ +} __attribute__((packed)); + +struct PlatformStructLookup { + char branch[16]; + struct PlatformKeyDescriptions *descr[2]; + uint32_t descrn[2]; + uint32_t pad[2]; +}; + +NSDictionary* SMCHumanReadableDescriptions(void) { + void *smc_lib = dlopen("/usr/lib/libSMC.dylib", RTLD_LAZY); + + if (smc_lib) { + struct PlatformStructLookup *lookup_arr = (struct PlatformStructLookup *)dlsym(smc_lib, "AccumulatorPlatformStructLookupArray"); + +/* if (!lookup_arr) { + // This library is normally in dyld shared cache, so we have to use DYLD_SHARED_REGION=avoid envvar. + // As a more convenient workaround we currently compile with an overlapping segment. + NSLog(@"Unable to solve AccumulatorPlatformStructLookupArray symbol, trying to brute-force...\n"); + + uint8_t *start = (uint8_t *)dlsym(smc_lib, "SMCReadKey"); + uint8_t *ptr = start; + char first[16] = "m87"; + while (ptr && memcmp(ptr, first, sizeof(first)) != 0) { + //printf("%08X: %02X\n", ptr-start, ptr[0]); + ptr++; + } + + lookup_arr = (struct PlatformStructLookup *)ptr; + } */ + NSMutableDictionary*dict=[NSMutableDictionary dictionary]; + if (lookup_arr) { + bool stop = false; + while (lookup_arr->branch[0] != '\0' && isascii(lookup_arr->branch[0]) && !stop) { +// printf("Dumping keys for %.4s...\n", lookup_arr->branch); + + for (uint32_t i = 0; i < 2 && !stop; i++) { + // printf(" Set %u has %u keys:\n", i, lookup_arr->descrn[i]); + for (uint32_t j = 0; j < lookup_arr->descrn[i]; j++) { + struct PlatformKeyDescriptions *key = &lookup_arr->descr[i][j]; + if (key->pad1 != 0 || key->pad2 != 0) { + stop = true; + break; + } + /* + printf(" [%c%c%c%c] type [%c%c%c%c] %02X%02X%02X%02X len [%2u] idx [%3u]: %.256s\n", + key->key[3] == '\0' ? ' ' : key->key[3], key->key[2] == '\0' ? ' ' : key->key[2], + key->key[1] == '\0' ? ' ' : key->key[1], key->key[0] == '\0' ? ' ' : key->key[0], + key->type[3], key->type[2], key->type[1], key->type[0] == '\0' ? '?' : key->type[3], + key->type[3], key->type[2], key->type[1], key->type[0], + key->len, key->index, key->description); + */ + char s[5]={key->key[3],key->key[2],key->key[1],key->key[0],0}; + NSString*smcKey=[NSString stringWithUTF8String:s]; + NSString*desc=[NSString stringWithUTF8String:key->description]; + dict[smcKey]=desc; + } + } + + lookup_arr++; + } + + dlclose(smc_lib); + return dict; + } else { + NSLog(@"Unable to locate lookup array in libSMC.dylib!"); + dlclose(smc_lib); + } + } else { + NSLog(@"Unable to open libSMC.dylib!"); + } + + return nil; +} diff --git a/releases.html b/releases.html index 8107ee43..c2be1354 100644 --- a/releases.html +++ b/releases.html @@ -17,6 +17,10 @@
+
2.1.4 (Feb/1/2021)
+
+ The temperature sensor to be used is now selectable. +
2.1.3 (Jan/25/2021)
Shows the CPU temperature on Apple Silicon macs.