summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog6
-rw-r--r--i3status.110
-rw-r--r--i3status.c46
-rw-r--r--i3status.conf3
-rw-r--r--i3status.h2
5 files changed, 64 insertions, 3 deletions
diff --git a/debian/changelog b/debian/changelog
index f7a0b05..dbdaf9b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+i3status (1.1-1) unstable; urgency=low
+
+ * Implement getting temperature from thermal zones (Thanks atsutane)
+
+ -- Michael Stapelberg <michael@stapelberg.de> Fri, 22 May 2009 21:23:44 +0200
+
i3status (1.0-1) unstable; urgency=low
* Initial release
diff --git a/i3status.1 b/i3status.1
index 417dc7c..facd043 100644
--- a/i3status.1
+++ b/i3status.1
@@ -91,6 +91,11 @@ Get current speed of the ethernet interface using the same mechanism as
ethtool. You need to start i3status with root privileges to use this.
.TP
+.B get_cpu_temperature
+Gets the temperature of the first thermal zone or the specified thermal zone
+(if any). Use it to display your CPU temperature.
+
+.TP
.B normcolors
Specifies the colors for background/border in the same format (html colorcodes)
as wmii's configuration (just the last two values), that is #222222 #333333 for
@@ -122,6 +127,7 @@ System-wide configuration file.
\&order run,wlan,eth,battery,load,time
\&normcolors #000000 #333333
\&color
+\&get_cpu_temperature
.Ve
.SH MOUNTING WMII'S PSEUDO FILESYSTEM
@@ -143,8 +149,10 @@ this, please fix it and send me a patch.
.BR date (1),
.BR glob (3)
-.SH AUTHOR
+.SH AUTHORS
Michael Stapelberg <michael+i3status at stapelberg dot de>
+Thorsten Toepper <atsutane at freethoughts dot de>
+
.SH WEBSITE
See http://i3.zekjur.net/i3status for the newest release.
diff --git a/i3status.c b/i3status.c
index c04a70d..ad4384f 100644
--- a/i3status.c
+++ b/i3status.c
@@ -5,6 +5,7 @@
*
*
* Copyright © 2008-2009 Michael Stapelberg and contributors
+ * Copyright © 2009 Thorsten Toepper <atsutane at freethoughts dot de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
@@ -88,6 +89,8 @@ static char *wmii_path;
static const char *time_format;
static bool use_colors;
static bool get_ethspeed;
+static bool get_cpu_temperature;
+static char *thermal_zone;
static const char *wmii_normcolors = "#222222 #333333";
static char order[MAX_ORDER][2];
static const char **run_watches;
@@ -200,6 +203,8 @@ static void setup(void) {
create_file(concat(order[ORDER_WLAN],"wlan"));
if (eth_interface)
create_file(concat(order[ORDER_ETH],"eth"));
+ if (get_cpu_temperature)
+ create_file(concat(order[ORDER_CPU_TEMPERATURE], "cpu_temperature"));
create_file(concat(order[ORDER_LOAD],"load"));
if (time_format)
create_file(concat(order[ORDER_TIME],"time"));
@@ -480,6 +485,33 @@ static char *get_eth_info() {
}
/*
+ * Reads the CPU temperature from /sys/class/thermal/thermal_zone0/temp and
+ * returns the temperature in degree celcius.
+ *
+ */
+static char *get_cpu_temperature_info() {
+ static char part[16];
+ char buf[16];
+ int temp;
+ int fd;
+
+ memset(buf, 0, sizeof(buf));
+ memset(part, 0, sizeof(part));
+
+ if ((fd = open(thermal_zone, O_RDONLY)) == -1)
+ die("Could not open %s\n", thermal_zone);
+ (void)read(fd, buf, sizeof(buf));
+ (void)close(fd);
+
+ if (sscanf(buf, "%d", &temp) != 1)
+ (void)snprintf(part, sizeof(part), "T: ? C");
+ else
+ (void)snprintf(part, sizeof(part), "T: %d C", (temp/1000));
+
+ return part;
+}
+
+/*
* Checks if the PID in path is still valid by checking:
* (Linux) if /proc/<pid> exists
* (NetBSD) if sysctl returns process infos for this pid
@@ -572,7 +604,16 @@ static int load_configuration(const char *configfile) {
use_colors = true;
OPT("get_ethspeed")
get_ethspeed = true;
- OPT("normcolors")
+ OPT("get_cpu_temperature") {
+ get_cpu_temperature = true;
+ if (strlen(dest_value) > 0) {
+ if (asprintf(&thermal_zone, "/sys/class/thermal/thermal_zone%d/temp", atoi(dest_value)) == -1)
+ die("Could not build thermal_zone path\n");
+ } else {
+ if (asprintf(&thermal_zone, "/sys/class/thermal/thermal_zone0/temp") == -1)
+ die("Could not build thermal_zone path\n");
+ }
+ } OPT("normcolors")
wmii_normcolors = strdup(dest_value);
OPT("interval")
interval = atoi(dest_value);
@@ -621,6 +662,7 @@ static int load_configuration(const char *configfile) {
SET_ORDER("wlan", ORDER_WLAN);
SET_ORDER("eth", ORDER_ETH);
SET_ORDER("battery", ORDER_BATTERY);
+ SET_ORDER("cpu_temperature", ORDER_CPU_TEMPERATURE);
SET_ORDER("load", ORDER_LOAD);
SET_ORDER("time", ORDER_TIME);
token = walk;
@@ -697,6 +739,8 @@ int main(int argc, char *argv[]) {
SIMPLEQ_FOREACH(current_battery, &batteries, batteries) {
write_to_statusbar(concat(order[ORDER_BATTERY], "battery"), get_battery_info(current_battery), false);
}
+ if (get_cpu_temperature)
+ write_to_statusbar(concat(order[ORDER_CPU_TEMPERATURE], "cpu_temperature"), get_cpu_temperature_info(), false);
/* Get load */
#ifdef LINUX
diff --git a/i3status.conf b/i3status.conf
index 4b204b0..7410d1a 100644
--- a/i3status.conf
+++ b/i3status.conf
@@ -25,3 +25,6 @@ color
# Checks ethernet interface speed (this needs root privileges)
get_ethspeed
+
+# Checks core temperature
+get_cpu_temperature
diff --git a/i3status.h b/i3status.h
index 2d6ce81..77deb1c 100644
--- a/i3status.h
+++ b/i3status.h
@@ -1,4 +1,4 @@
#define BEGINS_WITH(haystack, needle) (strncmp(haystack, needle, strlen(needle)) == 0)
typedef enum { CS_DISCHARGING, CS_CHARGING, CS_FULL } charging_status_t;
-enum { ORDER_RUN, ORDER_WLAN, ORDER_ETH, ORDER_BATTERY, ORDER_LOAD, ORDER_TIME, MAX_ORDER };
+enum { ORDER_RUN, ORDER_WLAN, ORDER_ETH, ORDER_BATTERY, ORDER_CPU_TEMPERATURE, ORDER_LOAD, ORDER_TIME, MAX_ORDER };