Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jmrlgg/0a89a78337ac8f35a29618a1553e8247 to your computer and use it in GitHub Desktop.
Save jmrlgg/0a89a78337ac8f35a29618a1553e8247 to your computer and use it in GitHub Desktop.
Adds a new Meter to htop that displays your core temperatures. You need the lm_sensors package to use this meter. After applying this patch, you have to call ./autogen.sh before configuring and compiling.
diff -urN htop-1.0.2-orig/CRT.c htop-1.0.2/CRT.c
--- htop-1.0.2-orig/CRT.c 2013-03-23 14:10:29.500604247 +0100
+++ htop-1.0.2/CRT.c 2013-03-23 14:11:01.916663508 +0100
@@ -59,6 +59,9 @@
UPTIME,
BATTERY,
TASKS_RUNNING,
+ TEMPERATURE_COOL,
+ TEMPERATURE_MEDIUM,
+ TEMPERATURE_HOT,
SWAP,
PROCESS,
PROCESS_SHADOW,
@@ -255,6 +258,9 @@
CRT_colors[METER_VALUE] = A_BOLD;
CRT_colors[LED_COLOR] = A_NORMAL;
CRT_colors[TASKS_RUNNING] = A_BOLD;
+ CRT_colors[TEMPERATURE_COOL] = A_DIM;
+ CRT_colors[TEMPERATURE_MEDIUM] = A_NORMAL;
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD;
CRT_colors[PROCESS] = A_NORMAL;
CRT_colors[PROCESS_SHADOW] = A_DIM;
CRT_colors[PROCESS_TAG] = A_BOLD;
@@ -316,6 +322,9 @@
CRT_colors[METER_VALUE] = ColorPair(Black,White);
CRT_colors[LED_COLOR] = ColorPair(Green,White);
CRT_colors[TASKS_RUNNING] = ColorPair(Green,White);
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Green,White);
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,White);
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,White);
CRT_colors[PROCESS] = ColorPair(Black,White);
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,White);
CRT_colors[PROCESS_TAG] = ColorPair(White,Blue);
@@ -377,6 +386,9 @@
CRT_colors[METER_VALUE] = ColorPair(Black,Black);
CRT_colors[LED_COLOR] = ColorPair(Green,Black);
CRT_colors[TASKS_RUNNING] = ColorPair(Green,Black);
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Green,Black);
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,Black);
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black);
CRT_colors[PROCESS] = ColorPair(Black,Black);
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black);
CRT_colors[PROCESS_TAG] = ColorPair(White,Blue);
@@ -438,6 +450,9 @@
CRT_colors[METER_VALUE] = A_BOLD | ColorPair(Cyan,Blue);
CRT_colors[LED_COLOR] = ColorPair(Green,Blue);
CRT_colors[TASKS_RUNNING] = A_BOLD | ColorPair(Green,Blue);
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Green,Blue);
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,Blue);
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Blue);
CRT_colors[PROCESS] = ColorPair(White,Blue);
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Blue);
CRT_colors[PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Blue);
@@ -499,6 +514,9 @@
CRT_colors[METER_VALUE] = ColorPair(Green,Black);
CRT_colors[LED_COLOR] = ColorPair(Green,Black);
CRT_colors[TASKS_RUNNING] = A_BOLD | ColorPair(Green,Black);
+ CRT_colors[TEMPERATURE_COOL] = ColorPair(Cyan,Black);
+ CRT_colors[TEMPERATURE_MEDIUM] = ColorPair(Yellow,Black);
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black);
CRT_colors[PROCESS] = ColorPair(Cyan,Black);
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black);
CRT_colors[PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Black);
@@ -561,6 +579,9 @@
CRT_colors[METER_VALUE] = A_BOLD | ColorPair(Cyan,Black);
CRT_colors[LED_COLOR] = ColorPair(Green,Black);
CRT_colors[TASKS_RUNNING] = A_BOLD | ColorPair(Green,Black);
+ CRT_colors[TEMPERATURE_COOL] = A_BOLD | ColorPair(Green,Black);
+ CRT_colors[TEMPERATURE_MEDIUM] = A_BOLD | ColorPair(Yellow,Black);
+ CRT_colors[TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black);
CRT_colors[PROCESS] = A_NORMAL;
CRT_colors[PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black);
CRT_colors[PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Black);
diff -urN htop-1.0.2-orig/Header.c htop-1.0.2/Header.c
--- htop-1.0.2-orig/Header.c 2013-03-23 14:10:29.496604239 +0100
+++ htop-1.0.2/Header.c 2013-03-23 14:11:01.916663508 +0100
@@ -12,6 +12,7 @@
#include "MemoryMeter.h"
#include "SwapMeter.h"
#include "TasksMeter.h"
+#include "TemperatureMeter.h"
#include "LoadAverageMeter.h"
#include "UptimeMeter.h"
#include "BatteryMeter.h"
@@ -151,6 +152,7 @@
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter));
Vector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter));
+// Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TemperatureMeter));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter));
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter));
}
diff -urN htop-1.0.2-orig/Makefile.am htop-1.0.2/Makefile.am
--- htop-1.0.2-orig/Makefile.am 2013-03-23 14:10:29.499604245 +0100
+++ htop-1.0.2/Makefile.am 2013-03-23 14:12:23.748812438 +0100
@@ -20,7 +20,7 @@
BatteryMeter.c Process.c ProcessList.c RichString.c ScreenManager.c Settings.c \
IOPriorityPanel.c SignalsPanel.c String.c SwapMeter.c TasksMeter.c TraceScreen.c \
UptimeMeter.c UsersTable.c Vector.c AvailableColumnsPanel.c AffinityPanel.c \
-HostnameMeter.c OpenFilesScreen.c Affinity.c IOPriority.c
+HostnameMeter.c OpenFilesScreen.c Affinity.c IOPriority.c TemperatureMeter.c
myhtopheaders = AvailableColumnsPanel.h AvailableMetersPanel.h \
CategoriesPanel.h CheckItem.h ClockMeter.h ColorsPanel.h ColumnsPanel.h \
@@ -29,7 +29,7 @@
BatteryMeter.h Meter.h MetersPanel.h Object.h Panel.h ProcessList.h RichString.h \
ScreenManager.h Settings.h SignalsPanel.h String.h \
SwapMeter.h TasksMeter.h TraceScreen.h UptimeMeter.h UsersTable.h Vector.h \
-Process.h AffinityPanel.h HostnameMeter.h OpenFilesScreen.h Affinity.h IOPriority.h
+Process.h AffinityPanel.h HostnameMeter.h OpenFilesScreen.h Affinity.h IOPriority.h TemperatureMeter.h
SUFFIXES = .h
diff -urN htop-1.0.2-orig/Meter.c htop-1.0.2/Meter.c
--- htop-1.0.2-orig/Meter.c 2013-03-23 14:10:29.499604245 +0100
+++ htop-1.0.2/Meter.c 2013-03-23 14:11:01.917663509 +0100
@@ -11,6 +11,7 @@
#include "MemoryMeter.h"
#include "SwapMeter.h"
#include "TasksMeter.h"
+#include "TemperatureMeter.h"
#include "LoadAverageMeter.h"
#include "UptimeMeter.h"
#include "BatteryMeter.h"
@@ -126,6 +127,7 @@
&MemoryMeter,
&SwapMeter,
&TasksMeter,
+ &TemperatureMeter,
&UptimeMeter,
&BatteryMeter,
&HostnameMeter,
diff -urN htop-1.0.2-orig/TemperatureMeter.c htop-1.0.2/TemperatureMeter.c
--- htop-1.0.2-orig/TemperatureMeter.c 1970-01-01 01:00:00.000000000 +0100
+++ htop-1.0.2/TemperatureMeter.c 2013-03-23 14:11:01.917663509 +0100
@@ -0,0 +1,97 @@
+/*
+htop - TemperatureMeter.c
+(C) 2013 Ralf Stemmer
+Released under the GNU GPL, see the COPYING file
+in the source distribution for its full text.
+*/
+
+#include "TemperatureMeter.h"
+
+#include "ProcessList.h"
+#include "CRT.h"
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+/*{
+#include "Meter.h"
+}*/
+
+int TemperatureMeter_attributes[] = {
+ TEMPERATURE_COOL,
+ TEMPERATURE_MEDIUM,
+ TEMPERATURE_HOT,
+};
+
+static void TemperatureMeter_setValues(Meter* this, char* buffer, int len) {
+ ProcessList* pl = this->pl;
+ this->total = pl->totalTasks;
+ this->values[0] = pl->runningTasks;
+ snprintf(buffer, len, "%d/%d", (int) this->values[0], (int) this->total);
+}
+
+static void TemperatureMeter_display(Object* cast, RichString* out) {
+ FILE *p;
+ p = popen("sensors", "r");
+ if(p == NULL) return 1;
+
+ int textColor = CRT_colors[METER_TEXT];
+ int coolColor = CRT_colors[TEMPERATURE_COOL];
+ int mediumColor = CRT_colors[TEMPERATURE_MEDIUM];
+ int hotColor = CRT_colors[TEMPERATURE_HOT];
+
+ size_t read, len;
+ char *line = NULL;
+ char *entry = NULL;
+ char *tstart = NULL, *tend = NULL;
+ int temperature;
+ while ((read = getline(&line, &len, p)) != -1) {
+ // contains this line a core-temperature?
+ entry = strstr(line, "Core ");
+ if (entry == NULL) continue;
+
+ // find the begin of the temperature value
+ tstart = strchr(entry, '+'); // no negative temperatures expected :)
+ if (tstart == NULL) continue;
+ tstart++; // jump over the '+'
+
+ // find the end of the temperature. Remember, it can be above 99°C ;)
+ tend = strchr(tstart, '.'); // just the integer
+ if (tend == NULL) continue;
+
+ // convert the string into an integer, this is necessary for further steps
+ temperature = strtol(tstart, &tend, 10);
+ if (temperature == LONG_MAX || temperature == LONG_MIN) continue;
+ if (tstart == tend) continue;
+
+ // choose the color for the temperature
+ int tempColor;
+ if (temperature < 80) tempColor = coolColor;
+ else if (temperature >= 80 && temperature < 90) tempColor = mediumColor;
+ else tempColor = hotColor;
+
+ // output the temperature
+ char buffer[20];
+ sprintf(buffer, "%d", temperature);
+ RichString_append(out, tempColor, buffer);
+ RichString_append(out, textColor, "°C ");
+ }
+
+ free(line);
+ pclose(p);
+}
+
+MeterType TemperatureMeter = {
+ .setValues = TemperatureMeter_setValues,
+ .display = TemperatureMeter_display,
+ .mode = TEXT_METERMODE,
+ .items = 1,
+ .total = 100.0,
+ .attributes = TemperatureMeter_attributes,
+ .name = "Temperature",
+ .uiName = "Temperature Sensors",
+ .caption = "Temperature: "
+};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment