icewm/src/acpustatus.cc | 72 +++++++++++++++++++++++++++++++++++++++++----- icewm/src/acpustatus.h | 2 + 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/icewm/src/acpustatus.cc b/icewm/src/acpustatus.cc index 33b1070..2444f83 100644 --- a/icewm/src/acpustatus.cc +++ b/icewm/src/acpustatus.cc @@ -205,17 +205,29 @@ bool CPUStatus::handleTimer(YTimer *t) { void CPUStatus::updateToolTip() { #ifdef linux - char load[31]; + char load[31], ram[31], swap[31], temp[31], freq[31]; struct sysinfo sys; - double l1, l5, l15; + float l1, l5, l15, tr, fr, ts, fs; sysinfo(&sys); - l1 = sys.loads[0] / 65536.0; - l5 = sys.loads[1] / 65536.0; - l15 = sys.loads[2] / 65536.0; - sprintf(load, "%3.2f %3.2f %3.2f, %d", - l1, l5, l15, sys.procs); - char *loadmsg = strJoin(_("CPU Load: "), load, _(" processes."), NULL); + l1 = (float)sys.loads[0] / 65536.0; + l5 = (float)sys.loads[1] / 65536.0; + l15 = (float)sys.loads[2] / 65536.0; + sprintf(load, "%3.2f %3.2f %3.2f, %d", l1, l5, l15, sys.procs); + tr =(float)sys.totalram * (float)sys.mem_unit / 1048576.0; + fr =(float)sys.freeram * (float)sys.mem_unit / 1048576.0;; + sprintf(ram, "%5.2f/%.2fM", tr, fr); + ts =(float)sys.totalswap * (float)sys.mem_unit / 1048576.0; + fs =(float)sys.freeswap * (float)sys.mem_unit / 1048576.0; + sprintf(swap, "%.2f/%.2fM", ts, fs); + getTemp(temp, sizeof(temp)/sizeof(char)); + sprintf(freq, "%.3fGHz", getFreq(0) / 1e6); + char *loadmsg = strJoin(_("CPU Load: "), load, + "\n", _("Ram: "), ram, + "\n", _("Swap: "), swap, + "\n", _("Temp: "), temp, + "\n", _("Freq: "), freq, + NULL); setToolTip(loadmsg); delete [] loadmsg; #elif defined HAVE_GETLOADAVG2 @@ -253,6 +265,50 @@ void CPUStatus::updateStatus() { repaint(); } +int CPUStatus::getTemp(char* tempbuf, int buflen) { + int retbuflen = 0; + char namebuf[64]; + char buf[64]; + + memset(tempbuf, 0, buflen); + for (int thr = 0 ; thr < 64; thr++) { + int fd, seglen; + sprintf(namebuf,"/proc/acpi/thermal_zone/THR%d/temperature", thr); + fd = open(namebuf, O_RDONLY); + if(fd != -1){ + int len = read(fd, buf, sizeof(buf) - 1); + buf[len-1] = '\0'; + seglen =strlen(buf + len - 7); + if (retbuflen + seglen >= buflen) { + retbuflen =-retbuflen; + close(fd); + break; + } + retbuflen += seglen; + strncat(tempbuf, buf + len - 7, seglen); + close(fd); + } + } + return(retbuflen); +} + +float CPUStatus::getFreq(unsigned int cpu) { + char buf[16], namebuf[64]; + int fd; + float freq = 1e6; + + sprintf(namebuf,"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", cpu); + fd = open(namebuf, O_RDONLY); + if (fd != -1) { + int len = read(fd, buf, sizeof(buf) - 1); + buf[len-1] = '\0'; + sscanf(buf,"%f",&freq); + close(fd); + } + return(freq); +} + + void CPUStatus::getStatus() { #ifdef linux char *p, buf[4096]; diff --git a/icewm/src/acpustatus.h b/icewm/src/acpustatus.h index 4bfab85..f2c71c9 100644 --- a/icewm/src/acpustatus.h +++ b/icewm/src/acpustatus.h @@ -28,6 +28,8 @@ public: void updateStatus(); void getStatus(); + int getTemp(char* tempbuf, int buflen); + float getFreq(unsigned int cpu); void updateToolTip(); private: