diff -Naur wmcms-0.3.5/state_linux.h wmcms-0.3.5/state_linux.h --- wmcms-0.3.5/state_linux.h 2001-09-24 00:56:28.000000000 +0200 +++ wmcms-0.3.5/state_linux.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,47 +0,0 @@ -/* wmcms - WindowMaker CPU / Mem Usage Monitor DockApp - * state_linux.h - * Linux specific functions to get system usage, may someone write it to another plataform - * Copyright (C) 2001 Fabio Pugliese Ornellas - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -int cpu_user; -int cpu_nice; -int cpu_kernel; -int cpu_idle; - -int mem_total; -int mem_used; -int mem_buffers; -int mem_cached; - -int swap_total; -int swap_used; - -void get_cpuinfo ( void ) -{ - FILE *fp; - fp = fopen ( "/proc/stat", "r" ); - fscanf ( fp, "%*s %d %d %d %d", &cpu_user, &cpu_nice, &cpu_kernel, &cpu_idle ); - fclose ( fp ); -} - -void get_meminfo ( void ) -{ - FILE *fp; - fp = fopen ( "/proc/meminfo", "r" ); - fscanf ( fp, "%*s %*s %*s %*s %*s %*s %*s %d %d %*d %*d %d %d %*s %d %d", &mem_total, &mem_used, &mem_buffers, &mem_cached, &swap_total, &swap_used ); - fclose ( fp ); -} diff -Naur wmcms-0.3.5/state_linux_2.4.h wmcms-0.3.5/state_linux_2.4.h --- wmcms-0.3.5/state_linux_2.4.h 1970-01-01 01:00:00.000000000 +0100 +++ wmcms-0.3.5/state_linux_2.4.h 2004-07-20 22:09:11.157182296 +0200 @@ -0,0 +1,47 @@ +/* wmcms - WindowMaker CPU / Mem Usage Monitor DockApp + * state_linux.h + * Linux specific functions to get system usage, may someone write it to another plataform + * Copyright (C) 2001 Fabio Pugliese Ornellas + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +int cpu_user; +int cpu_nice; +int cpu_kernel; +int cpu_idle; + +int mem_total; +int mem_used; +int mem_buffers; +int mem_cached; + +int swap_total; +int swap_used; + +void get_cpuinfo_24 ( void ) +{ + FILE *fp; + fp = fopen ( "/proc/stat", "r" ); + fscanf ( fp, "%*s %d %d %d %d", &cpu_user, &cpu_nice, &cpu_kernel, &cpu_idle ); + fclose ( fp ); +} + +void get_meminfo_24 ( void ) +{ + FILE *fp; + fp = fopen ( "/proc/meminfo", "r" ); + fscanf ( fp, "%*s %*s %*s %*s %*s %*s %*s %d %d %*d %*d %d %d %*s %d %d", &mem_total, &mem_used, &mem_buffers, &mem_cached, &swap_total, &swap_used ); + fclose ( fp ); +} diff -Naur wmcms-0.3.5/state_linux_2.6.h wmcms-0.3.5/state_linux_2.6.h --- wmcms-0.3.5/state_linux_2.6.h 1970-01-01 01:00:00.000000000 +0100 +++ wmcms-0.3.5/state_linux_2.6.h 2004-07-20 22:08:54.256751552 +0200 @@ -0,0 +1,55 @@ +/* wmcms - WindowMaker CPU / Mem Usage Monitor DockApp + * state_linux.h + * Linux specific functions to get system usage, may someone write it to another plataform + * Copyright (C) 2001 Fabio Pugliese Ornellas + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +int cpu_user; +int cpu_nice; +int cpu_kernel; +int cpu_idle; + +int mem_total; +int mem_free; +int mem_used; +int mem_buffers; +int mem_cached; + +int swap_total; +int swap_free; +int swap_used; + +void get_cpuinfo_26 ( void ) +{ + FILE *fp; + fp = fopen ( "/proc/stat", "r" ); + fscanf ( fp, "%*s %d %d %d %d", &cpu_user, &cpu_nice, &cpu_kernel, &cpu_idle ); + fclose ( fp ); +} + +void get_meminfo_26 ( void ) +{ + FILE *fp; + fp = fopen ( "/proc/meminfo", "r" ); +/* The format of /proc/meminfo has changed with the 2.6 kernel; this new line will work for 2.6 -- idh + fscanf ( fp, "%*s %*s %*s %*s %*s %*s %*s %d %d %*d %*d %d %d %*s %d %d", &mem_total, &mem_used, &mem_buffers, &mem_cached, &swap_total, &swap_used ); */ + fscanf ( fp, "%*s %d %*s %*s %d %*s %*s %d %*s %*s %d %*s %*s %*d %*s %*s %*d %*s %*s %*d %*s %*s %*d %*s %*s %*d %*s %*s %*d %*s %*s %*d %*s %*s %d %*s %*s %d %*s", + &mem_total, &mem_free, &mem_buffers, &mem_cached, &swap_total, &swap_free ); + fclose ( fp ); + + mem_used = mem_total - mem_free; + swap_used = swap_total - swap_free; +} diff -Naur wmcms-0.3.5/wmcms.c wmcms-0.3.5/wmcms.c --- wmcms-0.3.5/wmcms.c 2001-09-24 00:57:06.000000000 +0200 +++ wmcms-0.3.5/wmcms.c 2004-07-20 22:34:26.917751664 +0200 @@ -19,7 +19,8 @@ #include #include #include -#include "state_linux.h" +#include "state_linux_2.6.h" +#include "state_linux_2.4.h" #include "wmcms.xpm" char *displayName = ""; @@ -34,6 +35,13 @@ int no_nice; char *exe = ""; +typedef enum +{ + IS_2_6 = 0, + IS_OTHER +} kernel_versions; +kernel_versions kernel_version; + /* command line */ static DAProgramOption options[] = { {"-d", "--display", "display to use", DOString, False, {&displayName} }, @@ -44,6 +52,8 @@ {"-p", "--program", "program to run on CPU click", DOString, False, {&exe} } }; +kernel_versions Get_Kernel_version(void); + /* draw bars */ void bar ( int size, int x, int y, int barx, int bary ) { @@ -156,6 +166,9 @@ /* define callbacks */ DACallbacks callbacks = { NULL, change, NULL, NULL, NULL, NULL }; + /* determine kernel version */ + kernel_version = Get_Kernel_version(); + advanced = 0; up = 0; no_nice = 0; @@ -204,14 +217,23 @@ XCopyArea ( DADisplay, backdrop, pixmap, gc, 3, 140, 58, 58, 0, 0); DASetPixmap(pixmap); - /* initial cpu total while splash */ - get_cpuinfo(); + /* initial cpu total while splash */ + if (kernel_version == IS_2_6) + get_cpuinfo_26(); + else + get_cpuinfo_24(); + old_cpu_user = cpu_user; old_cpu_nice = cpu_nice; old_cpu_kernel = cpu_kernel; old_cpu_idle = cpu_idle; usleep ( delay ); - get_cpuinfo(); + + if (kernel_version == IS_2_6) + get_cpuinfo_26(); + else + get_cpuinfo_24(); + cpu_total = cpu_user - old_cpu_user + cpu_nice - old_cpu_nice + cpu_kernel - old_cpu_kernel + cpu_idle - old_cpu_idle; /* draw background */ @@ -230,8 +252,16 @@ XCopyArea ( DADisplay, backdrop, pixmap, gc, 4, 14, 56, 8, 1, 49 ); /* read values */ - get_cpuinfo (); - get_meminfo (); + if (kernel_version == IS_2_6) + { + get_cpuinfo_26 (); + get_meminfo_26 (); + } + else + { + get_cpuinfo_24 (); + get_meminfo_24 (); + } /* cpu total */ cpu_total = cpu_user - old_cpu_user + cpu_nice - old_cpu_nice + cpu_kernel - old_cpu_kernel + cpu_idle - old_cpu_idle; @@ -328,3 +358,20 @@ fprintf(stderr, "Congratulations, something truely awful has happened.\n"); return -1; } + +kernel_versions Get_Kernel_version(void) +{ + FILE *fp = fopen("/proc/version", "r"); + char buf[512]; + + if (!fp) return IS_OTHER; + if (!fgets(buf, 512, fp)) + { + fclose(fp); + return IS_OTHER; + } + fclose(fp); + + if (strstr(buf, "2.6.")) return IS_2_6; + return IS_OTHER; +}