[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[E-devel] e_modules/cpu shelf patch



Here's a patch for the cpu-module to make it play with the shelf.

I've changed the theme to look like the net and mem modules, the pngs
showing the meters can be downloaded here:
http://347.shit.la/pics.tar.gz
(renamed images from from net-module).


/Regards
Tobias Glenstrup


--- Makefile.am.orig	2006-06-29 06:59:33.000000000 +0200
+++ Makefile.am	2006-06-29 06:59:39.000000000 +0200
@@ -33,7 +33,7 @@
 		       e_mod_config.c \
 		       e_mod_config.h
 
-module_la_LIBADD       = @e_libs@ -lm
+module_la_LIBADD       = @e_libs@
 module_la_LDFLAGS      = -module -avoid-version
 module_la_DEPENDENCIES = $(top_builddir)/config.h
 
--- cpu.edc.orig	2006-06-28 01:25:46.000000000 +0200
+++ cpu.edc	2006-06-30 00:45:34.000000000 +0200
@@ -1,6 +1,28 @@
 images
 {
    image: "cpu.png" COMP;
+   image: "cpu_hi_00.png" COMP;
+   image: "cpu_hi_01.png" COMP;
+   image: "cpu_hi_02.png" COMP;
+   image: "cpu_hi_03.png" COMP;
+   image: "cpu_hi_04.png" COMP;
+   image: "cpu_hi_05.png" COMP;
+   image: "cpu_hi_06.png" COMP;
+   image: "cpu_hi_07.png" COMP;
+   image: "cpu_hi_08.png" COMP;
+   image: "cpu_hi_09.png" COMP;
+   image: "cpu_hi_10.png" COMP;
+   image: "cpu_lo_00.png" COMP;
+   image: "cpu_lo_01.png" COMP;
+   image: "cpu_lo_02.png" COMP;
+   image: "cpu_lo_03.png" COMP;
+   image: "cpu_lo_04.png" COMP;
+   image: "cpu_lo_05.png" COMP;
+   image: "cpu_lo_06.png" COMP;
+   image: "cpu_lo_07.png" COMP;
+   image: "cpu_lo_08.png" COMP;
+   image: "cpu_lo_09.png" COMP;
+   image: "cpu_lo_10.png" COMP;
 }
 
 fonts
@@ -13,125 +35,379 @@
    group
      {
 	name: "modules/cpu/main";
+	min: 4 4;
+	max: 128 128;
+	script 
+	  {
+	     public message(Msg_Type:type, id, ...) 
+	       {
+		  if ((type == MSG_INT_SET) && (id == 1))
+		    {
+		       new f = getarg(2);
+		       new Float:value;
+
+		       value = f;
+		       value = (value / 50);
+		       if (value >= 1.0)
+			 {
+			    set_state(PART:"cpu_lo_meter", "default", 1.0);
+			    set_state(PART:"cpu_hi_meter", "default", value - 1.0);
+			 }
+		       else
+			 {
+			    set_state(PART:"cpu_hi_meter", "default", 0.0);
+			    set_state(PART:"cpu_lo_meter", "default", value);
+			 }
+
+		    }
+	       }	     
+	  }
+
 	parts
 	  {
 	     part
 	       {
-		  name:           "fade_clip";
-		  type:           RECT;
-		  mouse_events:   0;
+		  name: "fade_clip";
+		  type: RECT;
 		  description
 		    {
 		       state: "default" 0.0;
 		       color: 255 255 255 255;
+		       rel1
+			 {
+			    relative: 0.0 0.0;
+			    offset: 0 0;
+			 }
+		       rel2
+			 {
+			    relative: 1.0 1.0;
+			    offset: -1 -1;
+			 }
 		    }
 	       }
 	     part
 	       {
 		  name: "cpu";
+		  type: IMAGE;
 		  clip_to: "fade_clip";
 		  description
 		    {
 		       state: "default" 0.0;
 		       aspect: 1.0 1.0;
-		       align: 0.5 0.5;
 		       rel1
 			 {
 			    relative: 0.0 0.0;
+			    offset: 0 0;
 			 }
 		       rel2
 			 {
 			    relative: 1.0 1.0;
+			    offset: -1 -1;
 			 }
 		       image
 			 {
 			    normal: "cpu.png";
 			 }
+		       color: 255 255 255 192;
 		    }
 	       }
-
-	     part
+	     part 
 	       {
-		  name,          "lines";
-		  mouse_events,  0;
-		  type,          SWALLOW;
-		  clip_to: 	"fade_clip";
-		  description
+		  name: "cpu_label";
+		  type: TEXT;
+		  clip_to: "fade_clip";
+		  effect: SOFT_SHADOW;
+		  description 
 		    {
-		       state,    "default" 0.0;
-		       rel1
+		       state: "default" 0.0;
+		       color: 255 255 255 0;
+		       color3: 0 0 0 0;
+		       visible: 0;
+		       rel1 
 			 {
 			    relative: 0.0 0.0;
+			    offset: 0 0;
+			    to: "cpu";
 			 }
-		       rel2
+		       rel2 
 			 {
 			    relative: 1.0 1.0;
+			    offset: 1 -1;
+			    to: "cpu";
+			 }
+		       text 
+			 {
+			    text: "XX%";
+			    font: "VeraMono";
+			    size: 9;
+			    min: 1 1;
+			    align: 0.5 0.5;
+			    text_class: "module_normal";
 			 }
-		       color, 0 0 0 0;
+		    }
+		  description 
+		    {
+		       state: "visible" 0.0;
+		       inherit: "default" 0.0;
+		       visible: 1;
+		       color: 0 0 0 255;
+		       color3: 255 255 255 42;
 		    }
 	       }
-	  }
-     }
-   //close group net
-
-   group
-     {
-	name: "modules/cpu/text";
-	parts
-	  {
 	     part
 	       {
-		  name:           "text_clip";
-		  type:           RECT;
-		  mouse_events:   0;
+		  name: "cpu_hi_meter";
+		  type: IMAGE;
+		  clip_to: "fade_clip";
+
 		  description
 		    {
 		       state: "default" 0.0;
-		       color: 255 255 255 255;
-		       rel1 
+		       rel1
 			 {
 			    relative: 0.0 0.0;
 			    offset: 0 0;
 			 }
-		       rel2 
+		       rel2
 			 {
-			    relative: 1.0 1.0;
-			    offset: -1 -1;			    
+			    relative: 1.0 0.25;
+			    offset: -1 -1;
+			 }
+		       image
+			 {
+			    normal: "cpu_hi_00.png";
 			 }
+		       color: 255 255 255 192;
 		    }
-	       }	     
+		  description
+		    {
+		       state: "default" 0.1;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_01.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.2;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_02.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.3;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_03.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.4;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_04.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.5;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_05.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.6;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_06.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.7;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_07.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.8;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_08.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.9;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_09.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 1.0;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_hi_10.png";
+			 }
+		    }
+	       }
 	     part
 	       {
-		  name:           "in-text";
-		  type:           TEXT;
-		  effect:         SOFT_SHADOW;
-		  mouse_events: 0;
-		  clip_to: "text_clip";
+		  name: "cpu_lo_meter";
+		  type: IMAGE;
+		  clip_to: "fade_clip";
+
 		  description
 		    {
 		       state: "default" 0.0;
-		       align: 0.5 0.5;
 		       rel1
 			 {
-			    relative: 0.5  0.5;
+			    relative: 0.0 0.75;
+			    offset: 0 0;
 			 }
 		       rel2
 			 {
-			    relative: 0.5  0.5;
+			    relative: 1.0 1.0;
+			    offset: -1 -1;
 			 }
-		       color: 0 0 0 255;
-		       color3: 255 255 255 100;
-		       text
+		       image
 			 {
-			    text: "";
-			    font: "VeraMono";
-			    size:  10;
-			    min:     1 1;
-			    align: 0.5 0.5;
+			    normal: "cpu_lo_00.png";
+			 }
+		       color: 255 255 255 192;
+		    }
+		  description
+		    {
+		       state: "default" 0.1;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_01.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.2;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_02.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.3;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_03.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.4;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_04.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.5;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_05.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.6;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_06.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.7;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_07.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.8;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_08.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 0.9;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_09.png";
+			 }
+		    }
+		  description
+		    {
+		       state: "default" 1.0;
+		       inherit: "default" 0.0;
+		       image
+			 {
+			    normal: "cpu_lo_10.png";
 			 }
 		    }
 	       }
+	     	     
+	  }
+	programs 
+	  {
+	     program 
+	       {
+		  name: "go_active";
+		  signal: "label_active";
+		  source: "";
+		  action: STATE_SET "visible" 0.0;
+		  transition: SINUSOIDAL 0.5;
+		  target: "cpu_label";
+	       }
+	     program 
+	       {
+		  name: "go_passive";
+		  signal: "label_passive";
+		  source: "";
+		  action: STATE_SET "default" 0.0;
+		  transition: SINUSOIDAL 1.0;		  
+		  target: "cpu_label";
+	       }
 	  }
      }
 }
-
--- e_mod_config.c.orig	2006-06-26 07:30:39.000000000 +0200
+++ e_mod_config.c	2006-06-29 06:49:00.000000000 +0200
@@ -1,28 +1,29 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
 #include <e.h>
 #include "e_mod_main.h"
-#include "e_mod_config.h"
-#include "config.h"
 
 struct _E_Config_Dialog_Data
 {
-   int check_interval;
-   int show_text;
-   int show_graph;
+   int  check_interval;
+   int  always_text;
 };
 
 /* Protos */
-static void *_create_data(E_Config_Dialog *cfd);
-static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
-static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
-static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
-static void _fill_data(Cpu *c, E_Config_Dialog_Data *cfdata);
+static void *_create_data(E_Config_Dialog * cfd);
+static void _free_data(E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata);
+static Evas_Object *_basic_create_widgets(E_Config_Dialog * cfd, Evas * evas, E_Config_Dialog_Data * cfdata);
+static int _basic_apply_data(E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata);
+static void _fill_data(Config_Item * ci, E_Config_Dialog_Data * cfdata);
 
 /* Config Calls */
 void
-_configure_cpu_module(E_Container *con, Cpu *c)
+_config_cpu_module(Config_Item * ci)
 {
    E_Config_Dialog *cfd;
    E_Config_Dialog_View *v;
+   E_Container *con;
 
    v = E_NEW(E_Config_Dialog_View, 1);
 
@@ -31,54 +32,53 @@
    v->basic.apply_cfdata = _basic_apply_data;
    v->basic.create_widgets = _basic_create_widgets;
 
-   cfd = e_config_dialog_new(con, D_("Cpu Configuration"), NULL, 0, v, c);
-   c->cfd = cfd;
+   con = e_container_current_get(e_manager_current_get());
+   cfd = e_config_dialog_new(con, D_("Cpu Configuration"), NULL, 0, v, ci);
+   cpu_config->config_dialog = cfd;
 }
 
 static void
-_fill_data(Cpu *c, E_Config_Dialog_Data *cfdata)
+_fill_data(Config_Item * ci, E_Config_Dialog_Data * cfdata)
 {
-   cfdata->check_interval = c->conf->check_interval;
-   cfdata->show_text = c->conf->show_text;
-   cfdata->show_graph = c->conf->show_graph;
+   cfdata->check_interval = ci->poll_time;
+   cfdata->always_text = ci->always_text;
 }
 
 static void *
-_create_data(E_Config_Dialog *cfd)
+_create_data(E_Config_Dialog * cfd)
 {
    E_Config_Dialog_Data *cfdata;
-   Cpu *c;
+   Config_Item *ci;
 
-   c = cfd->data;
+   ci = cfd->data;
    cfdata = E_NEW(E_Config_Dialog_Data, 1);
 
-   _fill_data(c, cfdata);
+   _fill_data(ci, cfdata);
    return cfdata;
 }
 
 static void
-_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
+_free_data(E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata)
 {
-   Cpu *c;
-
-   c = cfd->data;
-   c->cfd = NULL;
+   if (!cpu_config)
+      return;
+   cpu_config->config_dialog = NULL;
    free(cfdata);
 }
 
 static Evas_Object *
-_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
+_basic_create_widgets(E_Config_Dialog * cfd, Evas * evas, E_Config_Dialog_Data * cfdata)
 {
    Evas_Object *o, *of, *ob;
-   Cpu *c;
-
-   c = cfd->data;
+   E_Radio_Group *rg;
 
    o = e_widget_list_add(evas, 0, 0);
-   of = e_widget_framelist_add(evas, D_("Cpu Settings"), 0);
-   ob = e_widget_check_add(evas, D_("Show Text"), (&(cfdata->show_text)));
+
+   of = e_widget_framelist_add(evas, D_("General Settings"), 0);
+   rg = e_widget_radio_group_new(&(cfdata->always_text));
+   ob = e_widget_radio_add(evas, D_("Always Show Text"), 1, rg);
    e_widget_framelist_object_append(of, ob);
-   ob = e_widget_check_add(evas, D_("Show Graph"), (&(cfdata->show_graph)));
+   ob = e_widget_radio_add(evas, D_("Show Text On Mouse Over"), 0, rg);
    e_widget_framelist_object_append(of, ob);
 
    ob = e_widget_label_add(evas, D_("Check Interval:"));
@@ -91,18 +91,15 @@
 }
 
 static int
-_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
+_basic_apply_data(E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata)
 {
-   char *tmp;
-   Cpu *c;
+   Config_Item *ci;
 
-   c = cfd->data;
-   c->conf->check_interval = cfdata->check_interval;
-   c->conf->show_text = cfdata->show_text;
-   c->conf->show_graph = cfdata->show_graph;
+   ci = cfd->data;
+   ci->always_text = cfdata->always_text;
+   ci->poll_time = cfdata->check_interval;
    e_config_save_queue();
-   if (c->face->monitor)
-      ecore_timer_interval_set(c->face->monitor, (double)cfdata->check_interval);
 
+   _cpu_config_updated(ci->id);
    return 1;
 }
--- e_mod_config.h.orig	2006-06-26 07:30:47.000000000 +0200
+++ e_mod_config.h	2006-06-28 01:10:05.000000000 +0200
@@ -5,7 +5,7 @@
 
 #include "e_mod_main.h"
 
-void _configure_cpu_module(E_Container *con, Cpu *c);
+void _configure_cpu_module(E_Container * con, Cpu * c);
 
 #endif
 #endif
--- e_mod_main.c.orig	2006-06-26 07:30:17.000000000 +0200
+++ e_mod_main.c	2006-06-29 06:53:08.000000000 +0200
@@ -1,463 +1,396 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
 #include <e.h>
 #include "e_mod_main.h"
-#include "e_mod_config.h"
-#include "config.h"
+typedef struct _Instance Instance;
+typedef struct _Cpu Cpu;
 
-static Cpu *_cpu_init(E_Module *m);
-static void _cpu_shutdown(Cpu *n);
-static void _cpu_config_menu_new(Cpu *n);
-static int _cpu_face_init(Cpu_Face *cf);
-static void _cpu_face_menu_new(Cpu_Face *cf);
-static void _cpu_face_enable(Cpu_Face *cf);
-static void _cpu_face_disable(Cpu_Face *cf);
-static void _cpu_face_free(Cpu_Face *cf);
-static void _cpu_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change);
-static void _cpu_face_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
-static void _cpu_face_cb_menu_edit(void *data, E_Menu *mn, E_Menu_Item *mi);
-static void _cpu_face_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi);
-static int _cpu_face_update_values(void *data);
-static int _cpu_face_get_cpu_count(Cpu_Face *cf);
-static void _cpu_face_get_load(Cpu_Face *cf);
-static void _cpu_face_graph_values(Cpu_Face *cf);
-static void _cpu_face_graph_clear(Cpu_Face *cf);
+struct _Instance
+{
+   E_Gadcon_Client *gcc;
+   Evas_Object *o_text;
+   Cpu *cpu;
+   Ecore_Timer *check_timer;
+   unsigned long old_u[4];
+   unsigned long old_n[4];
+   unsigned long old_s[4];
+   unsigned long old_i[4];
+   unsigned long old_wa[4];
+   unsigned long old_hi[4];
+   unsigned long old_si[4];
+};
+
+struct _Cpu
+{
+   Instance *inst;
+   Evas_Object *cpu_obj;
+};
+static void _cpu_update(void *data, int value);
+
+/* gadcon requirements */
+static E_Gadcon_Client *_gc_init(E_Gadcon * gc, const char *name, const char *id, const char *style);
+static void _gc_shutdown(E_Gadcon_Client * gcc);
+static void _gc_orient(E_Gadcon_Client * gcc);
+static char *_gc_label(void);
+static Evas_Object *_gc_icon(Evas * evas);
+
+/* protos for module */
+static void _cpu_cb_mouse_down(void *data, Evas * evas, Evas_Object * obj, void *event_info);
+static void _cpu_cb_mouse_in(void *data, Evas * evas, Evas_Object * obj, void *event_info);
+static void _cpu_cb_mouse_out(void *data, Evas * evas, Evas_Object * obj, void *event_info);
+static void _cpu_menu_cb_post(void *data, E_Menu * m);
+static void _cpu_menu_cb_configure(void *data, E_Menu * mn, E_Menu_Item * mi);
+static void _cpu_get_load(Instance * inst);
+static int _cpu_update_values(void *data);
+static int _cpu_get_cpu_count(void);
+
+static Config_Item *_cpu_config_item_get(const char *id);
+static Cpu *_cpu_new(Evas * evas);
+static void _cpu_free(Cpu * cpu);
+
+static E_Config_DD *conf_edd = NULL;
+static E_Config_DD *conf_item_edd = NULL;
+
+Config *cpu_config = NULL;
 
 static int cpu_count;
 static int cpu_stats[4];
 
-EAPI E_Module_Api e_modapi = {
-   E_MODULE_API_VERSION,
-   "Cpu"
+static const E_Gadcon_Client_Class _gc_class = {
+   GADCON_CLIENT_CLASS_VERSION,
+   "cpu", {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon}
 };
 
-EAPI void *
-e_modapi_init(E_Module *m)
+static E_Gadcon_Client *
+_gc_init(E_Gadcon * gc, const char *name, const char *id, const char *style)
 {
-   Cpu *c;
+   E_Gadcon_Client *gcc;
+   Evas_Object *o;
+   Instance *inst;
+   Config_Item *ci;
+   Cpu *cpu;
 
-   /* Set up module's message catalogue */
-   bindtextdomain(PACKAGE, LOCALEDIR);
-   bind_textdomain_codeset(PACKAGE, "UTF-8");
+   inst = E_NEW(Instance, 1);
 
-   c = _cpu_init(m);
-   if (!c)
-      return NULL;
+   ci = _cpu_config_item_get(id);
+   if (!ci->id)
+      ci->id = evas_stringshare_add(id);
 
-   return c;
-}
+   cpu = _cpu_new(gc->evas);
+   cpu->inst = inst;
+   inst->cpu = cpu;
 
-EAPI int
-e_modapi_shutdown(E_Module *m)
-{
-   Cpu *c;
+   o = cpu->cpu_obj;
+   gcc = e_gadcon_client_new(gc, name, id, style, o);
+   gcc->data = inst;
+   inst->gcc = gcc;
+   inst->cpu->cpu_obj = o;
 
-   c = m->data;
-   if (!c)
-      return 0;
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _cpu_cb_mouse_down, inst);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN, _cpu_cb_mouse_in, inst);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _cpu_cb_mouse_in, inst);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT, _cpu_cb_mouse_out, inst);
 
-   if (c->cfd)
-     {
-        e_object_del(E_OBJECT(c->cfd));
-        c->cfd = NULL;
-     }
-   _cpu_shutdown(c);
-   return 1;
-}
+   if (ci->always_text)
+      edje_object_signal_emit(cpu->cpu_obj, "label_active", "");
+   else
+      edje_object_signal_emit(cpu->cpu_obj, "label_passive", "");
 
-EAPI int
-e_modapi_save(E_Module *m)
-{
-   Cpu *c;
+   _cpu_update_values(inst);
 
-   c = m->data;
-   if (!c)
-      return 0;
-   e_config_domain_save("module.cpu", c->conf_edd, c->conf);
-   return 1;
+   inst->check_timer = ecore_timer_add(ci->poll_time, _cpu_update_values, inst);
+   cpu_config->instances = evas_list_append(cpu_config->instances, inst);
+
+   return gcc;
 }
 
-EAPI int
-e_modapi_about(E_Module *m)
+static void
+_gc_orient(E_Gadcon_Client * gcc)
 {
-   e_module_dialog_show(D_("Enlightenment Cpu Monitor Module"), D_("This module is used to monitor a cpu."));
-   return 1;
+   e_gadcon_client_aspect_set(gcc, 16, 16);
+   e_gadcon_client_min_size_set(gcc, 16, 16);
 }
 
-EAPI int
-e_modapi_config(E_Module *m)
+static char *
+_gc_label(void)
 {
-   Cpu *c;
-   E_Container *con;
-
-   c = m->data;
-   if (!c)
-      return 0;
-   if (!c->face)
-      return 0;
-
-   con = e_container_current_get(e_manager_current_get());
-   if (c->face->con == con)
-      _configure_cpu_module(con, c);
-
-   return 1;
+   return D_("Cpu");
 }
 
-static Cpu *
-_cpu_init(E_Module *m)
+static Evas_Object *
+_gc_icon(Evas * evas)
 {
-   Cpu *c;
-   E_Menu_Item *mi;
-   Evas_List *mans, *l, *l2;
-
-   c = E_NEW(Cpu, 1);
+   Evas_Object *o;
+   char buf[4096];
 
-   if (!c)
-      return NULL;
+   o = edje_object_add(evas);
+   snprintf(buf, sizeof(buf), "%s/module.eap", e_module_dir_get(cpu_config->module));
+   edje_object_file_set(o, buf, "icon");
+   return o;
+}
 
-   c->conf_edd = E_CONFIG_DD_NEW("Cpu_Config", Config);
-#undef T
-#undef D
-#define T Config
-#define D c->conf_edd
-   E_CONFIG_VAL(D, T, check_interval, INT);
-   E_CONFIG_VAL(D, T, show_text, INT);
-   E_CONFIG_VAL(D, T, show_graph, INT);
+static void
+_gc_shutdown(E_Gadcon_Client * gcc)
+{
+   Instance *inst;
 
-   c->conf = e_config_domain_load("module.cpu", c->conf_edd);
-   if (!c->conf)
-     {
-        c->conf = E_NEW(Config, 1);
+   inst = gcc->data;
 
-        c->conf->check_interval = 1;
-        c->conf->show_text = 1;
-        c->conf->show_graph = 1;
-     }
-   E_CONFIG_LIMIT(c->conf->check_interval, 0, 60);
-   E_CONFIG_LIMIT(c->conf->show_text, 0, 1);
-   E_CONFIG_LIMIT(c->conf->show_graph, 0, 1);
+   if (inst->check_timer)
+      ecore_timer_del(inst->check_timer);
+   cpu_config->instances = evas_list_remove(cpu_config->instances, inst);
 
-   _cpu_config_menu_new(c);
+   evas_object_event_callback_del(inst->cpu->cpu_obj, EVAS_CALLBACK_MOUSE_DOWN, _cpu_cb_mouse_down);
+   evas_object_event_callback_del(inst->cpu->cpu_obj, EVAS_CALLBACK_MOUSE_IN, _cpu_cb_mouse_in);
+   evas_object_event_callback_del(inst->cpu->cpu_obj, EVAS_CALLBACK_MOUSE_MOVE, _cpu_cb_mouse_in);
+   evas_object_event_callback_del(inst->cpu->cpu_obj, EVAS_CALLBACK_MOUSE_OUT, _cpu_cb_mouse_out);
 
-   mans = e_manager_list();
-   for (l = mans; l; l = l->next)
-     {
-        E_Manager *man;
+   _cpu_free(inst->cpu);
+   free(inst);
+}
 
-        man = l->data;
-        for (l2 = man->containers; l2; l2 = l2->next)
-          {
-             E_Container *con;
-             Cpu_Face *cf;
+EAPI E_Module_Api e_modapi = {
+   E_MODULE_API_VERSION,
+   "Cpu"
+};
 
-             con = l2->data;
-             cf = E_NEW(Cpu_Face, 1);
+EAPI void *
+e_modapi_init(E_Module * m)
+{
+   bindtextdomain(PACKAGE, LOCALEDIR);
+   bind_textdomain_codeset(PACKAGE, "UTF-8");
 
-             if (cf)
-               {
-                  cf->conf_face_edd = E_CONFIG_DD_NEW("Cpu_Face_Config", Config_Face);
+   conf_item_edd = E_CONFIG_DD_NEW("Cpu_Config_Item", Config_Item);
 
 #undef T
 #undef D
-#define T Config_Face
-#define D cf->conf_face_edd
-                  E_CONFIG_VAL(D, T, enabled, UCHAR);
-
-                  c->face = cf;
-                  cf->cpu = c;
-                  cf->con = con;
-                  cf->evas = con->bg_evas;
-
-                  cf->conf = E_NEW(Config_Face, 1);
-
-                  cf->conf->enabled = 1;
+#define T Config_Item
+#define D conf_item_edd
+   E_CONFIG_VAL(D, T, id, STR);
+   E_CONFIG_VAL(D, T, poll_time, DOUBLE);
+   E_CONFIG_VAL(D, T, always_text, INT);
 
-                  if (!_cpu_face_init(cf))
-                     return NULL;
+   conf_edd = E_CONFIG_DD_NEW("Cpu_Config", Config);
 
-                  _cpu_face_menu_new(cf);
+#undef T
+#undef D
+#define T Config
+#define D conf_edd
+   E_CONFIG_LIST(D, T, items, conf_item_edd);
 
-                  mi = e_menu_item_new(c->config_menu);
-                  e_menu_item_label_set(mi, _("Configuration"));
-                  e_menu_item_callback_set(mi, _cpu_face_cb_menu_configure, cf);
+   cpu_config = e_config_domain_load("module.cpu", conf_edd);
+   if (!cpu_config)
+     {
+	Config_Item *ci;
 
-                  mi = e_menu_item_new(c->config_menu);
-                  e_menu_item_label_set(mi, con->name);
-                  e_menu_item_submenu_set(mi, cf->menu);
+	cpu_config = E_NEW(Config, 1);
+	ci = E_NEW(Config_Item, 1);
 
-                  if (!cf->conf->enabled)
-                     _cpu_face_disable(cf);
-                  else
-                     _cpu_face_enable(cf);
-               }
-          }
+	ci->id = evas_stringshare_add("0");
+	ci->poll_time = 1.0;
+	ci->always_text = 0;
+	cpu_config->items = evas_list_append(cpu_config->items, ci);
      }
-   return c;
+   cpu_config->module = m;
+   e_gadcon_provider_register(&_gc_class);
+   return 1;
 }
 
-static void
-_cpu_shutdown(Cpu *c)
+EAPI int
+e_modapi_shutdown(E_Module * m)
 {
-   _cpu_face_free(c->face);
-
-   E_FREE(c->conf);
-   E_CONFIG_DD_FREE(c->conf_edd);
-   E_FREE(c);
-}
+   cpu_config->module = NULL;
+   e_gadcon_provider_unregister(&_gc_class);
 
-static void
-_cpu_config_menu_new(Cpu *c)
-{
-   E_Menu *mn;
+   if (cpu_config->config_dialog)
+      e_object_del(E_OBJECT(cpu_config->config_dialog));
+   if (cpu_config->menu)
+     {
+	e_menu_post_deactivate_callback_set(cpu_config->menu, NULL, NULL);
+	e_object_del(E_OBJECT(cpu_config->menu));
+	cpu_config->menu = NULL;
+     }
+   while (cpu_config->items)
+     {
+	Config_Item *ci;
 
-   mn = e_menu_new();
-   c->config_menu = mn;
+	ci = cpu_config->items->data;
+	cpu_config->items = evas_list_remove_list(cpu_config->items, cpu_config->items);
+	if (ci->id)
+	   evas_stringshare_del(ci->id);
+	free(ci);
+     }
+   free(cpu_config);
+   cpu_config = NULL;
+   E_CONFIG_DD_FREE(conf_item_edd);
+   E_CONFIG_DD_FREE(conf_edd);
+   return 1;
 }
 
-static int
-_cpu_face_init(Cpu_Face *cf)
+EAPI int
+e_modapi_save(E_Module * m)
 {
-   Evas_Object *o;
-   char buf[4096];
-
-   evas_event_freeze(cf->evas);
+   Evas_List *l;
 
-   o = edje_object_add(cf->evas);
-   cf->cpu_obj = o;
-   if (!e_theme_edje_object_set(o, "base/theme/modules/cpu", "modules/cpu/main"))
+   for (l = cpu_config->instances; l; l = l->next)
      {
-        snprintf(buf, sizeof(buf), PACKAGE_DATA_DIR "/cpu.edj");
-        edje_object_file_set(o, buf, "modules/cpu/main");
-     }
-   evas_object_pass_events_set(o, 1);
-   evas_object_show(o);
-
-   o = edje_object_add(cf->evas);
-   cf->chart_obj = o;
-   evas_object_layer_set(o, 1);
-   evas_object_repeat_events_set(o, 0);
-   evas_object_pass_events_set(o, 1);
-   evas_object_color_set(o, 255, 255, 255, 255);
-   evas_object_show(o);
+	Instance *inst;
+	Config_Item *ci;
 
-   o = edje_object_add(cf->evas);
-   cf->txt_obj = o;
-   if (!e_theme_edje_object_set(o, "base/theme/modules/cpu", "modules/cpu/text"))
-     {
-        snprintf(buf, sizeof(buf), PACKAGE_DATA_DIR "/cpu.edj");
-        edje_object_file_set(o, buf, "modules/cpu/text");
+	inst = l->data;
+	ci = _cpu_config_item_get(inst->gcc->id);
+	if (ci->id)
+	   evas_stringshare_del(ci->id);
+	ci->id = evas_stringshare_add(inst->gcc->id);
      }
-   evas_object_layer_set(o, 2);
-   evas_object_repeat_events_set(o, 0);
-   evas_object_pass_events_set(o, 1);
-   evas_object_color_set(o, 255, 255, 255, 255);
-   evas_object_show(o);
-
-   o = evas_object_rectangle_add(cf->evas);
-   cf->event_obj = o;
-   evas_object_layer_set(o, 3);
-   evas_object_repeat_events_set(o, 1);
-   evas_object_color_set(o, 0, 0, 0, 0);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _cpu_face_cb_mouse_down, cf);
-   evas_object_show(o);
-
-   cf->gmc = e_gadman_client_new(cf->con->gadman);
-   e_gadman_client_domain_set(cf->gmc, "module.cpu", cpu_count++);
-   e_gadman_client_policy_set(cf->gmc,
-                              E_GADMAN_POLICY_ANYWHERE |
-                              E_GADMAN_POLICY_HMOVE | E_GADMAN_POLICY_HSIZE | E_GADMAN_POLICY_VMOVE | E_GADMAN_POLICY_VSIZE);
-   e_gadman_client_auto_size_set(cf->gmc, 45, 50);
-   e_gadman_client_align_set(cf->gmc, 1.0, 1.0);
-   e_gadman_client_resize(cf->gmc, 45, 50);
-   e_gadman_client_change_func_set(cf->gmc, _cpu_face_cb_gmc_change, cf);
-   e_gadman_client_load(cf->gmc);
-
-   evas_event_thaw(cf->evas);
-
-   cf->monitor = ecore_timer_add((double)cf->cpu->conf->check_interval, _cpu_face_update_values, cf);
+   e_config_domain_save("module.cpu", conf_edd, cpu_config);
    return 1;
 }
 
-static void
-_cpu_face_menu_new(Cpu_Face *cf)
+EAPI int
+e_modapi_about(E_Module * m)
 {
-   E_Menu *mn;
-   E_Menu_Item *mi;
-
-   mn = e_menu_new();
-   cf->menu = mn;
-
-   mi = e_menu_item_new(mn);
-   e_menu_item_label_set(mi, _("Configuration"));
-   e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration");
-   e_menu_item_callback_set(mi, _cpu_face_cb_menu_configure, cf);
-
-   mi = e_menu_item_new(mn);
-   e_menu_item_label_set(mi, _("Edit Mode"));
-   e_util_menu_item_edje_icon_set(mi, "enlightenment/gadgets");
-   e_menu_item_callback_set(mi, _cpu_face_cb_menu_edit, cf);
+   e_module_dialog_show(D_("Enlightenment Cpu Monitor Module"), D_("This module is used to monitor a cpu."));
+   return 1;
 }
 
-static void
-_cpu_face_enable(Cpu_Face *cf)
+static Cpu *
+_cpu_new(Evas * evas)
 {
-   cf->conf->enabled = 1;
-   e_config_save_queue();
-   evas_object_show(cf->cpu_obj);
-   evas_object_show(cf->event_obj);
-   if (cf->cpu->conf->show_graph)
-      evas_object_show(cf->chart_obj);
-   if (cf->cpu->conf->show_text)
-      evas_object_show(cf->txt_obj);
+   Cpu *cpu;
+   char buf[4096];
+
+   cpu = E_NEW(Cpu, 1);
+   cpu->cpu_obj = edje_object_add(evas);
+   snprintf(buf, sizeof(buf), "%s/cpu.edj", e_module_dir_get(cpu_config->module));
+   if (!e_theme_edje_object_set(cpu->cpu_obj, "base/theme/modules/cpu", "modules/cpu/main"))
+      edje_object_file_set(cpu->cpu_obj, buf, "modules/cpu/main");
+   evas_object_show(cpu->cpu_obj);
+   return cpu;
 }
 
 static void
-_cpu_face_disable(Cpu_Face *cf)
+_cpu_free(Cpu * cpu)
 {
-   cf->conf->enabled = 0;
-   e_config_save_queue();
-   evas_object_hide(cf->event_obj);
-   evas_object_hide(cf->chart_obj);
-   evas_object_hide(cf->cpu_obj);
-   evas_object_hide(cf->txt_obj);
+   evas_object_del(cpu->cpu_obj);
+   free(cpu);
 }
-
 static void
-_cpu_face_free(Cpu_Face *cf)
+_cpu_cb_mouse_down(void *data, Evas * evas, Evas_Object * obj, void *event_info)
 {
-   if (cf->monitor)
-      ecore_timer_del(cf->monitor);
-   if (cf->menu)
-      e_object_del(E_OBJECT(cf->menu));
-   if (cf->event_obj)
-      evas_object_del(cf->event_obj);
-   if (cf->cpu_obj)
-      evas_object_del(cf->cpu_obj);
-   if (cf->old_values)
-      _cpu_face_graph_clear(cf);
-   if (cf->chart_obj)
-      evas_object_del(cf->chart_obj);
-   if (cf->txt_obj)
-      evas_object_del(cf->txt_obj);
+   Evas_Event_Mouse_Down *ev;
+   Instance *inst;
 
-   if (cf->gmc)
+   inst = data;
+   ev = event_info;
+   if ((ev->button == 3) && (!cpu_config->menu))
      {
-        e_gadman_client_save(cf->gmc);
-        e_object_del(E_OBJECT(cf->gmc));
-     }
+	E_Menu *mn;
+	E_Menu_Item *mi;
+	int  x, y, w, h;
 
-   E_FREE(cf->conf);
-   E_FREE(cf);
-   cpu_count--;
-}
+	mn = e_menu_new();
+	e_menu_post_deactivate_callback_set(mn, _cpu_menu_cb_post, inst);
+	cpu_config->menu = mn;
 
-static void
-_cpu_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change)
-{
-   Cpu_Face *cf;
-   Evas_Coord x, y, w, h;
+	mi = e_menu_item_new(mn);
+	e_menu_item_label_set(mi, _("Configuration"));
+	e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration");
+	e_menu_item_callback_set(mi, _cpu_menu_cb_configure, inst);
 
-   cf = data;
-   switch (change)
-     {
-     case E_GADMAN_CHANGE_MOVE_RESIZE:
-        e_gadman_client_geometry_get(cf->gmc, &x, &y, &w, &h);
-        evas_object_move(cf->chart_obj, x, y);
-        evas_object_move(cf->event_obj, x, y);
-        evas_object_move(cf->cpu_obj, x, y);
-        evas_object_move(cf->txt_obj, x, y);
-        evas_object_resize(cf->chart_obj, w, h);
-        evas_object_resize(cf->event_obj, w, h);
-        evas_object_resize(cf->cpu_obj, w, h);
-        evas_object_resize(cf->txt_obj, w, h);
-        _cpu_face_graph_clear(cf);
-        break;
-     case E_GADMAN_CHANGE_RAISE:
-        evas_object_raise(cf->cpu_obj);
-        evas_object_raise(cf->chart_obj);
-        evas_object_raise(cf->event_obj);
-        evas_object_raise(cf->txt_obj);
-        break;
-     default:
-        break;
+	mi = e_menu_item_new(mn);
+	e_menu_item_separator_set(mi, 1);
+
+	e_gadcon_client_util_menu_items_append(inst->gcc, mn, 0);
+	e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, &w, &h);
+
+	e_menu_activate_mouse(mn,
+			      e_util_zone_current_get(e_manager_current_get()),
+			      x + ev->output.x, y + ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
+	evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, EVAS_BUTTON_NONE, ev->timestamp, NULL);
      }
 }
-
 static void
-_cpu_face_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+_cpu_cb_mouse_in(void *data, Evas * evas, Evas_Object * obj, void *event_info)
 {
-   Cpu_Face *cf;
-   Evas_Event_Mouse_Down *ev;
+   Instance *inst;
 
-   ev = event_info;
-   cf = data;
-   if (ev->button == 3)
-     {
-        e_menu_activate_mouse(cf->menu, e_zone_current_get(cf->con),
-                              ev->output.x, ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
-        e_util_container_fake_mouse_up_all_later(cf->con);
-     }
+   inst = data;
+   edje_object_signal_emit(inst->cpu->cpu_obj, "label_active", "");
 }
-
 static void
-_cpu_face_cb_menu_edit(void *data, E_Menu *mn, E_Menu_Item *mi)
+_cpu_cb_mouse_out(void *data, Evas * evas, Evas_Object * obj, void *event_info)
 {
-   Cpu_Face *cf;
+   Instance *inst;
+   Config_Item *ci;
 
-   cf = data;
-   e_gadman_mode_set(cf->gmc->gadman, E_GADMAN_MODE_EDIT);
+   inst = data;
+   ci = _cpu_config_item_get(inst->gcc->id);
+   if (!ci->always_text)
+      edje_object_signal_emit(inst->cpu->cpu_obj, "label_passive", "");
+}
+static void
+_cpu_menu_cb_post(void *data, E_Menu * m)
+{
+   if (!cpu_config->menu)
+      return;
+   e_object_del(E_OBJECT(cpu_config->menu));
+   cpu_config->menu = NULL;
 }
 
 static void
-_cpu_face_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi)
+_cpu_menu_cb_configure(void *data, E_Menu * mn, E_Menu_Item * mi)
 {
-   Cpu_Face *cf;
+   Instance *inst;
+   Config_Item *ci;
 
-   cf = data;
-   _configure_cpu_module(cf->con, cf->cpu);
+   inst = data;
+
+   if (!inst)
+      return;
+
+   ci = _cpu_config_item_get(inst->gcc->id);
+   _config_cpu_module(ci);
 }
 
 static int
-_cpu_face_update_values(void *data)
+_cpu_update_values(void *data)
 {
-   Cpu_Face *cf;
+   Instance *inst;
    char str[100];
-   int i = 0;
+   int  i = 0;
    char str_tmp[100];
 
-   cf = data;
-   _cpu_face_get_load(cf);
+   inst = data;
 
-   if (cpu_stats[0] == -1)
-      return 1;
+   _cpu_get_load(inst);
 
-   if (cf->cpu->conf->show_text)
+   if (cpu_stats[0] == -1)
      {
-        snprintf(str, sizeof(str), "%d%%", cpu_stats[0]);
-        i = 1;
-        while (i < cpu_count)
-          {
-             snprintf(str_tmp, sizeof(str_tmp), " / %d%%", cpu_stats[i]);
-             strncat(str, str_tmp, sizeof(str));
-             i++;
-          }
-        edje_object_part_text_set(cf->txt_obj, "in-text", str);
+	return 1;
      }
-   else
-      edje_object_part_text_set(cf->txt_obj, "in-text", "");
 
-   if ((cf->cpu->conf->show_graph) && (edje_object_part_exists(cf->cpu_obj, "lines")))
-      _cpu_face_graph_values(cf);
-   else
-      _cpu_face_graph_clear(cf);
+   snprintf(str, sizeof(str), "%d%%", cpu_stats[0]);
+   i = 1;
+   while (i < cpu_count + 1)
+     {
+	snprintf(str_tmp, sizeof(str_tmp), " / %d%%", cpu_stats[i]);
+	strncat(str, str_tmp, sizeof(str));
+	i++;
+     }
+   edje_object_part_text_set(inst->cpu->cpu_obj, "cpu_label", str);
 
+   _cpu_update(inst, cpu_stats[0]);
    return 1;
 }
 
 static int
-_cpu_face_get_cpu_count(Cpu_Face *cf)
+_cpu_get_cpu_count(void)
 {
    char tmp[4];
    FILE *f;
-   int cpu = -1;
+   int  cpu = -1;
 
    if (!(f = fopen("/proc/stat", "r")))
       return -1;
@@ -470,174 +403,136 @@
 }
 
 static void
-_cpu_face_get_load(Cpu_Face *cf)
+_cpu_get_load(Instance * inst)
 {
-   static unsigned long old_u[4], old_n[4], old_s[4], old_i[4], old_wa[4], old_hi[4], old_si[4];
+   Config_Item *ci;
    unsigned long new_u, new_n, new_s, new_i, new_wa = 0, new_hi = 0, new_si = 0, ticks_past;
-   int tmp_u, tmp_n, tmp_s, tmp_i;
+   int  tmp_u, tmp_n, tmp_s, tmp_i;
    char dummy[16];
    FILE *stat;
-   int cpu_count;
-   Edje_Message_Float msg;
+   int  cpu_count;
+   int  i = 0;
 
-   cpu_count = _cpu_face_get_cpu_count(cf);
+   cpu_count = _cpu_get_cpu_count();
    if (cpu_count == -1)
       return;
 
    if (!(stat = fopen("/proc/stat", "r")))
       return;
 
-   int i = 0;
+   ci = _cpu_config_item_get(inst->gcc->id);
 
    while (i < cpu_count)
      {
 
-        if (fscanf(stat, "%s %lu %lu %lu %lu %lu %lu %lu", dummy, &new_u, &new_n, &new_s, &new_i, &new_wa, &new_hi, &new_si) < 5)
-          {
-             fclose(stat);
-             return;
-          }
-
-        ticks_past = ((new_u + new_n + new_s + new_i + new_wa + new_hi + new_si) -
-                      (old_u[i] + old_n[i] + old_s[i] + old_i[i] + old_wa[i] + old_hi[i] + old_si[i]));
+	if (fscanf
+	    (stat, "%s %lu %lu %lu %lu %lu %lu %lu", dummy, &new_u, &new_n,
+	     &new_s, &new_i, &new_wa, &new_hi, &new_si) < 5)
+	  {
+	     fclose(stat);
+	     return;
+	  }
 
-        if (ticks_past)
-          {
-             tmp_u = ((new_u - old_u[i]));
-             tmp_n = ((new_n - old_n[i]));
-             tmp_s = ((new_s - old_s[i]));
-             tmp_i = ((new_i - old_i[i]));
-          }
-        else
-          {
-             tmp_u = 0;
-             tmp_n = 0;
-             tmp_s = 0;
-             tmp_i = 0;
-          }
+	ticks_past =
+	   ((new_u + new_n + new_s + new_i + new_wa + new_hi + new_si) -
+	    (inst->old_u[i] + inst->old_n[i] + inst->old_s[i] + inst->old_i[i] + inst->old_wa[i] + inst->old_hi[i] + inst->old_si[i]));
 
-        /* Update the values */
-        cpu_stats[i] = (tmp_u + tmp_n + tmp_s) / cpu_count;
+	if (ticks_past)
+	  {
+	     tmp_u = ((new_u - inst->old_u[i]));
+	     tmp_n = ((new_n - inst->old_n[i]));
+	     tmp_s = ((new_s - inst->old_s[i]));
+	     tmp_i = ((new_i - inst->old_i[i]));
+	  }
+	else
+	  {
+	     tmp_u = 0;
+	     tmp_n = 0;
+	     tmp_s = 0;
+	     tmp_i = 0;
+	  }
 
-        old_u[i] = new_u;
-        old_n[i] = new_n;
-        old_s[i] = new_s;
-        old_i[i] = new_i;
-        old_wa[i] = new_wa;
-        old_hi[i] = new_hi;
-        old_si[i] = new_si;
+	/* Update the values */
+	cpu_stats[i] = ((tmp_u + tmp_n + tmp_s) / cpu_count) / ci->poll_time;
 
-        if (cpu_stats[i] >= 100)
-           cpu_stats[i] = 100;
+	inst->old_u[i] = new_u;
+	inst->old_n[i] = new_n;
+	inst->old_s[i] = new_s;
+	inst->old_i[i] = new_i;
+	inst->old_wa[i] = new_wa;
+	inst->old_hi[i] = new_hi;
+	inst->old_si[i] = new_si;
 
-        msg.val = cpu_stats[i];
-        edje_object_message_send(cf->cpu_obj, EDJE_MESSAGE_FLOAT, i, &msg);
+	if (cpu_stats[i] >= 100)
+	   cpu_stats[i] = 100;
 
-        i++;
+	i++;
      }
    fclose(stat);
 }
 
-static void
-_cpu_face_graph_values(Cpu_Face *cf)
+void
+_cpu_config_updated(const char *id)
 {
-   int x, y, w, h;
-   Evas_Object *o;
-   Evas_Object *last = NULL;
    Evas_List *l;
-   int i, j = 0;
-   int v;
-   int a = 255;
-   int b = 0;
-   int c = 100;
-   int d = 0;
-
-   evas_event_freeze(cf->evas);
-
-   evas_object_geometry_get(cf->chart_obj, &x, &y, &w, &h);
+   Config_Item *ci;
 
-   while (d < cpu_count)
+   if (!cpu_config)
+      return;
+   ci = _cpu_config_item_get(id);
+   for (l = cpu_config->instances; l; l = l->next)
      {
-        v = (int)((double)cpu_stats[d] * ((double)h / (double)100));
-        o = evas_object_line_add(cf->evas);
-        edje_object_part_swallow(cf->chart_obj, "lines", o);
-        evas_object_layer_set(o, 1);
-        if (cpu_stats[d] == 0)
-           evas_object_hide(o);
-        else
-          {
-             evas_object_line_xy_set(o, (x + w), (y + h), (x + w), ((y + h) - v));
-             switch (d)
-               {
-               case 0:
-                  evas_object_color_set(o, a, b, b, c);
-                  break;
-               case 1:
-                  evas_object_color_set(o, b, a, b, c);
-                  break;
-               case 2:
-                  evas_object_color_set(o, b, b, a, c);
-                  break;
-               case 3:
-                  evas_object_color_set(o, a, a, b, c);
-                  break;
-               default:
-                  break;
-               }
-             evas_object_pass_events_set(o, 1);
-             evas_object_show(o);
-          }
-
-        cf->old_values[d] = evas_list_prepend(cf->old_values[d], o);
-        l = cf->old_values[d];
-        for (i = (x + w); l && (j - 2) < w; l = l->next, j++)
-          {
-             Evas_Coord oy;
-             Evas_Object *lo;
+	Instance *inst;
 
-             lo = (Evas_Object *)evas_list_data(l);
-             evas_object_geometry_get(lo, NULL, &oy, NULL, NULL);
-             evas_object_move(lo, i--, oy);
-             last = lo;
-          }
+	inst = l->data;
+	if (!inst->gcc->id)
+	   continue;
 
-        if ((j - 2) >= w)
-          {
-             cf->old_values[d] = evas_list_remove(cf->old_values[d], last);
-             edje_object_part_unswallow(cf->chart_obj, last);
-             evas_object_del(last);
-          }
-        d++;
+	if (!strcmp(inst->gcc->id, ci->id))
+	  {
+	     if (inst->check_timer)
+		ecore_timer_del(inst->check_timer);
+	     inst->check_timer = ecore_timer_add((double)ci->poll_time, _cpu_update_values, inst);
+	     if (ci->always_text)
+		edje_object_signal_emit(inst->cpu->cpu_obj, "label_active", "");
+	     else
+		edje_object_signal_emit(inst->cpu->cpu_obj, "label_passive", "");
+	     break;
+	  }
      }
-
-   evas_event_thaw(cf->evas);
 }
 
-static void
-_cpu_face_graph_clear(Cpu_Face *cf)
+static Config_Item *
+_cpu_config_item_get(const char *id)
 {
-   int i = 0;
    Evas_List *l;
+   Config_Item *ci;
 
-   evas_event_freeze(cf->evas);
-
-   while (i < cpu_count)
+   for (l = cpu_config->items; l; l = l->next)
      {
-        for (l = cf->old_values[i]; l; l = l->next)
-          {
-             Evas_Object *o;
-
-             o = evas_list_data(l);
-             edje_object_part_unswallow(cf->chart_obj, o);
-             evas_object_del(o);
-          }
-        evas_list_free(cf->old_values[i]);
-        cf->old_values[i] = NULL;
-        i++;
+	ci = l->data;
+	if (!ci->id)
+	   continue;
+	if (!strcmp(ci->id, id))
+	   return ci;
      }
 
-   if (!cf->cpu->conf->show_graph)
-      evas_object_hide(cf->chart_obj);
+   ci = E_NEW(Config_Item, 1);
+   ci->id = evas_stringshare_add(id);
+   ci->poll_time = 1.0;
+   ci->always_text = 0;
+   cpu_config->items = evas_list_append(cpu_config->items, ci);
+   return ci;
+}
 
-   evas_event_thaw(cf->evas);
+static void
+_cpu_update(void *data, int value)
+{
+   Edje_Message_Int_Set val;
+   Instance *inst;
+
+   inst = data;
+   val.count = 1;
+   val.val[0] = value;
+   edje_object_message_send(inst->cpu->cpu_obj, EDJE_MESSAGE_INT_SET, 1, &val);
 }
--- e_mod_main.h.orig	2006-06-26 07:30:13.000000000 +0200
+++ e_mod_main.h	2006-06-28 01:10:08.000000000 +0200
@@ -4,59 +4,33 @@
 #define E_MOD_MAIN_H
 
 typedef struct _Config Config;
-typedef struct _Config_Face Config_Face;
-typedef struct _Cpu Cpu;
-typedef struct _Cpu_Face Cpu_Face;
+typedef struct _Config_Item Config_Item;
 
 struct _Config
 {
-   int check_interval;
-   int show_text;
-   int show_graph;
-};
-
-struct _Config_Face
-{
-   unsigned char enabled;
-};
-
-struct _Cpu
-{
-   E_Menu *config_menu;
-   Cpu_Face *face;
-   Config *conf;
-
-   E_Config_DD *conf_edd;
-   E_Config_Dialog *cfd;
+   E_Module *module;
+   E_Config_Dialog *config_dialog;
+   E_Menu *menu;
+   Evas_List *instances;
+   Evas_List *items;
 };
 
-struct _Cpu_Face
+struct _Config_Item
 {
-   Evas *evas;
-   E_Container *con;
-   E_Menu *menu;
-   Cpu *cpu;
-   Evas_List *old_values[4];
-
-   Config_Face *conf;
-   E_Config_DD *conf_face_edd;
-
-   Evas_Object *cpu_obj;
-   Evas_Object *event_obj;
-   Evas_Object *chart_obj;
-   Evas_Object *txt_obj;
-
-   Ecore_Timer *monitor;
-
-   E_Gadman_Client *gmc;
+   const char *id;
+   double poll_time;
+   int  always_text;
 };
 
 EAPI extern E_Module_Api e_modapi;
 
-EAPI void *e_modapi_init(E_Module *m);
-EAPI int e_modapi_shutdown(E_Module *m);
-EAPI int e_modapi_save(E_Module *m);
-EAPI int e_modapi_about(E_Module *m);
-EAPI int e_modapi_config(E_Module *m);
+EAPI void *e_modapi_init(E_Module * m);
+EAPI int e_modapi_shutdown(E_Module * m);
+EAPI int e_modapi_save(E_Module * m);
+EAPI int e_modapi_about(E_Module * m);
+
+void _cpu_config_updated(const char *id);
+void _config_cpu_module(Config_Item * ci);
+extern Config *cpu_config;
 
 #endif