aboutsummaryrefslogtreecommitdiffstats
path: root/darwin/Battery.c
diff options
context:
space:
mode:
authorDaniel Lange <DLange@git.local>2016-04-11 13:01:07 +0200
committerDaniel Lange <DLange@git.local>2016-04-11 13:01:07 +0200
commitff9409b1737627857eb47f64f536a3f66b6a09a4 (patch)
tree61b631ba551e68a4f656b8b76ff7bd0d9955fc64 /darwin/Battery.c
parentf75ab6d2c11e8a8e18191b087564aedebbeb96c5 (diff)
downloaddebian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.tar.gz
debian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.tar.bz2
debian_htop-ff9409b1737627857eb47f64f536a3f66b6a09a4.zip
Imported Upstream version 2.0.0upstream/2.0.0
Diffstat (limited to 'darwin/Battery.c')
-rw-r--r--darwin/Battery.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/darwin/Battery.c b/darwin/Battery.c
new file mode 100644
index 0000000..d197c04
--- /dev/null
+++ b/darwin/Battery.c
@@ -0,0 +1,75 @@
+
+#include "BatteryMeter.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreFoundation/CFString.h>
+#include <IOKit/ps/IOPowerSources.h>
+#include <IOKit/ps/IOPSKeys.h>
+
+void Battery_getData(double* level, ACPresence* isOnAC) {
+ CFTypeRef power_sources = IOPSCopyPowerSourcesInfo();
+
+ *level = -1;
+ *isOnAC = AC_ERROR;
+
+ if(NULL == power_sources) {
+ return;
+ }
+
+ if(power_sources != NULL) {
+ CFArrayRef list = IOPSCopyPowerSourcesList(power_sources);
+ CFDictionaryRef battery = NULL;
+ int len;
+
+ if(NULL == list) {
+ CFRelease(power_sources);
+
+ return;
+ }
+
+ len = CFArrayGetCount(list);
+
+ /* Get the battery */
+ for(int i = 0; i < len && battery == NULL; ++i) {
+ CFDictionaryRef candidate = IOPSGetPowerSourceDescription(power_sources,
+ CFArrayGetValueAtIndex(list, i)); /* GET rule */
+ CFStringRef type;
+
+ if(NULL != candidate) {
+ type = (CFStringRef) CFDictionaryGetValue(candidate,
+ CFSTR(kIOPSTransportTypeKey)); /* GET rule */
+
+ if(kCFCompareEqualTo == CFStringCompare(type, CFSTR(kIOPSInternalType), 0)) {
+ CFRetain(candidate);
+ battery = candidate;
+ }
+ }
+ }
+
+ if(NULL != battery) {
+ /* Determine the AC state */
+ CFStringRef power_state = CFDictionaryGetValue(battery, CFSTR(kIOPSPowerSourceStateKey));
+
+ *isOnAC = (kCFCompareEqualTo == CFStringCompare(power_state, CFSTR(kIOPSACPowerValue), 0))
+ ? AC_PRESENT
+ : AC_ABSENT;
+
+ /* Get the percentage remaining */
+ double current;
+ double max;
+
+ CFNumberGetValue(CFDictionaryGetValue(battery, CFSTR(kIOPSCurrentCapacityKey)),
+ kCFNumberDoubleType, &current);
+ CFNumberGetValue(CFDictionaryGetValue(battery, CFSTR(kIOPSMaxCapacityKey)),
+ kCFNumberDoubleType, &max);
+
+ *level = (current * 100.0) / max;
+
+ CFRelease(battery);
+ }
+
+ CFRelease(list);
+ CFRelease(power_sources);
+ }
+}
+

© 2014-2024 Faster IT GmbH | imprint | privacy policy