- Overhaul meters implementation;
- add AllCPUsMeter;
- because of that, the new .htoprc is incompatible with previous released versions.

diff --git a/Meter.h b/Meter.h
index 7c58c18..f97a593 100644
--- a/Meter.h
+++ b/Meter.h
@@ -1,94 +1,161 @@
-/* Do not edit this file. It was automatically genarated. */
+/* Do not edit this file. It was automatically generated. */
 
 #ifndef HEADER_Meter
 #define HEADER_Meter
 /*
-htop
+htop - Meter.c
 (C) 2004-2006 Hisham H. Muhammad
 Released under the GNU GPL, see the COPYING file
 in the source distribution for its full text.
 */
 
+#define _GNU_SOURCE
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <curses.h>
+#include <stdarg.h>
+
 #include "Object.h"
 #include "CRT.h"
 #include "ListItem.h"
 #include "String.h"
-
-#include <stdlib.h>
-#include <curses.h>
-#include <string.h>
-#include <math.h>
-#include <sys/param.h>
+#include "ProcessList.h"
 
 #include "debug.h"
 #include <assert.h>
 
-#define METER_BARBUFFER_LEN 128
-#define METER_GRAPHBUFFER_LEN 128
+#ifndef USE_FUNKY_MODES
+#define USE_FUNKY_MODES 1
+#endif
+
+#define METER_BUFFER_LEN 128
 
 
 typedef struct Meter_ Meter;
+typedef struct MeterType_ MeterType;
+typedef struct MeterMode_ MeterMode;
 
-typedef void(*Meter_SetValues)(Meter*);
+typedef void(*MeterType_Init)(Meter*);
+typedef void(*MeterType_Done)(Meter*);
+typedef void(*Meter_SetValues)(Meter*, char*, int);
 typedef void(*Meter_Draw)(Meter*, int, int, int);
 
-typedef enum MeterMode_ {
-   UNSET,
-   BAR,
-   TEXT,
-   GRAPH,
-   LED,
-   LAST_METERMODE
-} MeterMode;
+struct MeterMode_ {
+   Meter_Draw draw;
+   char* uiName;
+   int h;
+};
+
+struct MeterType_ {
+   Meter_SetValues setValues;
+   Object_Display display;
+   int mode;
+   int items;
+   double total;
+   int* attributes;
+   char* name;
+   char* uiName;
+   char* caption;
+   MeterType_Init init;
+   MeterType_Done done;
+   Meter_Draw draw;
+};
 
 struct Meter_ {
    Object super;
-   
-   int h;
-   int w;
+   char* caption;
+   MeterType* type;
+   int mode;
+   int param;
    Meter_Draw draw;
-   Meter_SetValues setValues;
-   int items;
-   int* attributes;
+   void* drawBuffer;
+   int h;
+   ProcessList* pl;
    double* values;
    double total;
-   char* caption;
-   char* name;
-   union {
-      RichString* rs;
-      char* c;
-      double* graph;
-   } displayBuffer;
-   MeterMode mode;
 };
 
 extern char* METER_CLASS;
 
+extern MeterType CPUMeter;
+extern MeterType ClockMeter;
+extern MeterType LoadAverageMeter;
+extern MeterType LoadMeter;
+extern MeterType MemoryMeter;
+extern MeterType SwapMeter;
+extern MeterType TasksMeter;
+extern MeterType UptimeMeter;
+extern MeterType AllCPUsMeter;
+
+typedef enum {
+   CUSTOM_METERMODE = 0,
+   BAR_METERMODE,
+   TEXT_METERMODE,
+#ifdef USE_FUNKY_MODES
+   GRAPH_METERMODE,
+   LED_METERMODE,
+#endif
+   LAST_METERMODE
+} MeterModeId;
+
+extern MeterType* Meter_types[9];
+extern MeterMode* Meter_modes[];
+
+
+#ifndef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#endif
 
 
 
 
-Meter* Meter_new(char* name, char* caption, int items);
 
-void Meter_init(Meter* this, char* name, char* caption, int items);
+#ifdef USE_FUNKY_MODES
+
+#endif
+
+
+
+Meter* Meter_new(ProcessList* pl, int param, MeterType* type);
 
 void Meter_delete(Object* cast);
 
-
-void Meter_done(Meter* this);
+void Meter_setCaption(Meter* this, char* caption);
 
 
-
-
-
-#define DrawDot(a,y,c) do { \
-   attrset(a); \
-   mvaddstr(y, x+k, c); \
-} while(0)
-
-
-void Meter_setMode(Meter* this, MeterMode mode);
+void Meter_setMode(Meter* this, int modeIndex);
 
 ListItem* Meter_toListItem(Meter* this);
 
+/* ---------- TextMeterMode ---------- */
+
+void TextMeterMode_draw(Meter* this, int x, int y, int w);
+
+/* ---------- BarMeterMode ---------- */
+
+
+void BarMeterMode_draw(Meter* this, int x, int y, int w);
+
+#ifdef USE_FUNKY_MODES
+
+/* ---------- GraphMeterMode ---------- */
+
+#define DrawDot(a,y,c) do { attrset(a); mvaddch(y, x+k, c); } while(0)
+
+
+
+void GraphMeterMode_draw(Meter* this, int x, int y, int w);
+
+/* ---------- LEDMeterMode ---------- */
+
+
+
+void LEDMeterMode_draw(Meter* this, int x, int y, int w);
+
+#endif
+
 #endif