Please disregard that first patch I sent out earlier. This one is an
updated version. It has been tested against current anon-CVS as of 19:40
CST.

This patch has configuration save/load as well as the features specified
in patch 2.0.

Here's the complete changelog for this patch.

ADDED : Configuration Menus!
ADDED : Support for Interval Changing. Intervals for CPU, Memory, and
Network are all adjustable.
ADDED : Support for Network Interface changing. Monitor now scans for
network interfaces on load and provides a menu with a list.
ADDED : Option to ignore Cache or Buffer memory.
ADDED : Save/load functions for all new configuration options using
e_config. (Thanks to the guys on the e-devel list for pointing me in the
right direction)

CHANGED : Clean up some more warnings.
CHANGED : Moved configuration items to the correct structure. After
reviewing the code of the modules provided with E17, this seemed like the
more approriate place for them.

TODO : The memory icon definitely needs some cleaning. The more I stare at
it, the more I don't care for it.

Thanks,

--
Ed Presutti (ekrunch on freenode)
Index: e17/apps/e_modules/src/modules/monitor/e_mod_main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_modules/src/modules/monitor/e_mod_main.c,v
retrieving revision 1.2
diff -b -u -3 -r1.2 e_mod_main.c
--- e17/apps/e_modules/src/modules/monitor/e_mod_main.c	19 Jul 2005 11:38:21 -0000	1.2
+++ e17/apps/e_modules/src/modules/monitor/e_mod_main.c	21 Jul 2005 00:37:50 -0000
@@ -14,6 +14,47 @@
 static void    _monitor_face_menu_new(Monitor_Face *face);
 static void    _monitor_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, 
 					   E_Gadman_Change change);
+static void _monitor_mem_real_ignore_buffers_set_cb(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_mem_real_ignore_cached_set_cb(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+
+static void _monitor_mem_interval_cb_fast(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_mem_interval_cb_medium(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_mem_interval_cb_normal(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_mem_interval_cb_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_mem_interval_cb_very_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+
+static void _monitor_cpu_interval_cb_fast(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_cpu_interval_cb_medium(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_cpu_interval_cb_normal(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_cpu_interval_cb_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_cpu_interval_cb_very_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+
+static void _monitor_net_interval_cb_fast(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_net_interval_cb_medium(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_net_interval_cb_normal(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_net_interval_cb_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_net_interval_cb_very_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi);
+static void _monitor_net_interface_cb(void *data, E_Menu *m,
+		                          E_Menu_Item *mi);
+
+
 static void _monitor_face_cb_mouse_down(void *data, Evas *e, Evas_Object *obj,
 					void *event_info);
 static void _monitor_face_cb_menu_enabled(void *data, E_Menu *m, 
@@ -38,6 +79,12 @@
 static E_Config_DD *conf_edd;
 static E_Config_DD *conf_face_edd;
 
+static Flow_Chart *flow_chart_cpu;
+static Flow_Chart *flow_chart_net_in;
+static Flow_Chart *flow_chart_net_out;
+static Flow_Chart *flow_chart_mem_real;
+static Flow_Chart *flow_chart_mem_swap;
+
 /* public module routines. all modules must have these */
 void *
 e_modapi_init(E_Module *module)
@@ -124,6 +171,12 @@
 #define T Config_Face
 #define D conf_face_edd
    E_CONFIG_VAL(D, T, enabled, INT);
+   E_CONFIG_VAL(D, T, cpu_interval, DOUBLE);
+   E_CONFIG_VAL(D, T, mem_interval, DOUBLE);
+   E_CONFIG_VAL(D, T, net_interval, DOUBLE);
+   E_CONFIG_VAL(D, T, net_interface, STR);
+   E_CONFIG_VAL(D, T, mem_real_ignore_cached, INT);
+   E_CONFIG_VAL(D, T, mem_real_ignore_buffers, INT);
 
    conf_edd = E_CONFIG_DD_NEW("Monitor_Config", Config);
 #undef T
@@ -162,6 +215,12 @@
 		    {
 		       face->conf = E_NEW(Config_Face, 1);
 		       face->conf->enabled = 1;
+		       face->conf->cpu_interval = 1.0;
+		       face->conf->mem_interval = 1.0;
+		       face->conf->net_interval = 1.0;
+		       face->conf->net_interface = strdup("eth0");
+		       face->conf->mem_real_ignore_cached = 0;
+		       face->conf->mem_real_ignore_buffers = 0;
 
 		       monitor->conf->faces = 
 			 evas_list_append(monitor->conf->faces, face->conf);
@@ -184,6 +243,31 @@
 		  /* Setup */
 		  if (!face->conf->enabled)
 		    _monitor_face_disable(face);
+
+		  /* 
+		   * Now that init is done, set up intervals,
+		   * interfaces, and memory monitor parameters
+		   * according to the configuration.
+		   */
+		  mem_real_ignore_buffers_set(
+				  face->conf->mem_real_ignore_buffers);
+		  mem_real_ignore_cached_set(
+				  face->conf->mem_real_ignore_cached);
+		  
+		  net_interface_set(
+				  face->conf->net_interface);
+
+		  flow_chart_update_rate_set(flow_chart_cpu,
+				  face->conf->cpu_interval);
+		  flow_chart_update_rate_set(flow_chart_mem_real,
+				  face->conf->mem_interval);
+		  flow_chart_update_rate_set(flow_chart_mem_swap,
+				  face->conf->mem_interval);
+		  flow_chart_update_rate_set(flow_chart_net_in,
+				  face->conf->net_interval);
+		  flow_chart_update_rate_set(flow_chart_net_out,
+				  face->conf->net_interval);
+		  
 	       }
 	  }
      }
@@ -221,8 +305,16 @@
    Monitor_Face *face;
    Evas_Object *o;
 
+   /* 
+    * Configuration cannot be used yet as the face config 
+    * is not initialized. Everything will be updated after 
+    * the init is complete.
+    */
+   double tmp_cpu_interval = 1.0;
+   double tmp_mem_interval = 1.0;
+   double tmp_net_interval = 1.0;
+
    Chart_Container *chart_con;
-   Flow_Chart *flow_chart;
 
    face = E_NEW(Monitor_Face, 1);
    if (!face) return NULL;
@@ -232,11 +324,6 @@
    
    evas_event_freeze(con->bg_evas);
    
-   /* setup intervals */
-   face->cpu_rate = 1.0;
-   face->mem_rate = 1.0;
-   face->net_rate = 1.0;
-
    /* setup monitor object */
    o = edje_object_add(con->bg_evas);
    face->monitor_object = o;
@@ -264,13 +351,13 @@
    evas_object_show(o);
    /* add cpu chart */
    chart_con = chart_container_new(con->bg_evas,0,0,0,0);
-   flow_chart = flow_chart_new();
-   flow_chart_color_set(flow_chart, 33, 100, 220, 255);
-   flow_chart_get_value_function_set(flow_chart, cpu_usage_get);
-   flow_chart_update_rate_set(flow_chart, face->cpu_rate);
-   chart_container_chart_add(chart_con, flow_chart);
+   flow_chart_cpu = flow_chart_new();
+   flow_chart_color_set(flow_chart_cpu, 33, 100, 220, 255);
+   flow_chart_get_value_function_set(flow_chart_cpu, cpu_usage_get);
+   flow_chart_update_rate_set(flow_chart_cpu, tmp_cpu_interval);
+   chart_container_chart_add(chart_con, flow_chart_cpu);
    face->chart_cpu = chart_con;   
-   flow_chart_callback_set(flow_chart, _monitor_cpu_text_update_callcack, face);
+   flow_chart_callback_set(flow_chart_cpu, _monitor_cpu_text_update_callcack, face);
    
    o = evas_object_rectangle_add(con->bg_evas);
    face->cpu_ev_obj = o;
@@ -291,23 +378,23 @@
    evas_object_show(o);
    /* add mem charts */
    chart_con = chart_container_new(con->bg_evas,0,0,0,0);
-   flow_chart = flow_chart_new();
-   flow_chart_color_set(flow_chart, 213, 91, 91, 255);
-   flow_chart_get_value_function_set(flow_chart, mem_real_usage_get);
-   flow_chart_update_rate_set(flow_chart, face->mem_rate);
-   chart_container_chart_add(chart_con, flow_chart);
+   flow_chart_mem_real = flow_chart_new();
+   flow_chart_color_set(flow_chart_mem_real, 213, 91, 91, 255);
+   flow_chart_get_value_function_set(flow_chart_mem_real, mem_real_usage_get);
+   flow_chart_update_rate_set(flow_chart_mem_real, tmp_mem_interval);
+   chart_container_chart_add(chart_con, flow_chart_mem_real);
    face->chart_mem = chart_con;   
-   flow_chart_callback_set(flow_chart, _monitor_mem_real_text_update_callback, 
-			   face);
+   flow_chart_callback_set(flow_chart_mem_real, 
+		           _monitor_mem_real_text_update_callback, face);
 
-   flow_chart = flow_chart_new();
-   flow_chart_color_set(flow_chart, 51, 181, 69, 255);
-   flow_chart_get_value_function_set(flow_chart, mem_swap_usage_get);
-   flow_chart_update_rate_set(flow_chart, face->mem_rate);
-   flow_chart_alignment_set(flow_chart, 0);
-   chart_container_chart_add(chart_con, flow_chart);
-   flow_chart_callback_set(flow_chart, _monitor_mem_swap_text_update_callback, 
-			   face);
+   flow_chart_mem_swap = flow_chart_new();
+   flow_chart_color_set(flow_chart_mem_swap, 51, 181, 69, 255);
+   flow_chart_get_value_function_set(flow_chart_mem_swap, mem_swap_usage_get);
+   flow_chart_update_rate_set(flow_chart_mem_swap, tmp_mem_interval);
+   flow_chart_alignment_set(flow_chart_mem_swap, 0);
+   chart_container_chart_add(chart_con, flow_chart_mem_swap);
+   flow_chart_callback_set(flow_chart_mem_swap, 
+		           _monitor_mem_swap_text_update_callback, face);
 
 
    o = evas_object_rectangle_add(con->bg_evas);
@@ -329,23 +416,23 @@
    evas_object_show(o);
    /* add net charts */
    chart_con = chart_container_new(con->bg_evas,0,0,0,0);
-   flow_chart = flow_chart_new();
-   flow_chart_color_set(flow_chart, 213, 91, 91, 255);
-   flow_chart_get_value_function_set(flow_chart, net_in_usage_get);
-   flow_chart_update_rate_set(flow_chart, face->net_rate);
-   chart_container_chart_add(chart_con, flow_chart);
+   flow_chart_net_in = flow_chart_new();
+   flow_chart_color_set(flow_chart_net_in, 213, 91, 91, 255);
+   flow_chart_get_value_function_set(flow_chart_net_in, net_in_usage_get);
+   flow_chart_update_rate_set(flow_chart_net_in, tmp_net_interval);
+   chart_container_chart_add(chart_con, flow_chart_net_in);
    face->chart_net = chart_con;   
-   flow_chart_callback_set(flow_chart, _monitor_net_in_text_update_callcack, 
-			   face);
+   flow_chart_callback_set(flow_chart_net_in, 
+		           _monitor_net_in_text_update_callcack, face);
    
-   flow_chart = flow_chart_new();
-   flow_chart_color_set(flow_chart, 51, 181, 69, 255);
-   flow_chart_get_value_function_set(flow_chart, net_out_usage_get);
-   flow_chart_update_rate_set(flow_chart, face->net_rate);
-   flow_chart_alignment_set(flow_chart, 0);
-   chart_container_chart_add(chart_con, flow_chart);
-   flow_chart_callback_set(flow_chart, _monitor_net_out_text_update_callcack, 
-			   face);
+   flow_chart_net_out = flow_chart_new();
+   flow_chart_color_set(flow_chart_net_out, 51, 181, 69, 255);
+   flow_chart_get_value_function_set(flow_chart_net_out, net_out_usage_get);
+   flow_chart_update_rate_set(flow_chart_net_out, tmp_net_interval);
+   flow_chart_alignment_set(flow_chart_net_out, 0);
+   chart_container_chart_add(chart_con, flow_chart_net_out);
+   flow_chart_callback_set(flow_chart_net_out, 
+		           _monitor_net_out_text_update_callcack, face);
 
 
    o = evas_object_rectangle_add(con->bg_evas);
@@ -488,8 +575,16 @@
    if (face->monitor_object) evas_object_del(face->monitor_object);
    if (face->table_object) evas_object_del(face->table_object);
 
+   e_object_del(E_OBJECT(face->menu_network_interface));
+   e_object_del(E_OBJECT(face->menu_network_interval));
+   e_object_del(E_OBJECT(face->menu_network));
+   e_object_del(E_OBJECT(face->menu_memory_interval));
+   e_object_del(E_OBJECT(face->menu_memory));
+   e_object_del(E_OBJECT(face->menu_cpu_interval));
+   e_object_del(E_OBJECT(face->menu_cpu));
    e_object_del(E_OBJECT(face->menu));
 
+   free(face->conf->net_interface);
    free(face->conf);
    free(face);
    _monitor_count--;
@@ -514,24 +609,200 @@
 static void
 _monitor_face_menu_new(Monitor_Face *face)
 {
-   E_Menu *mn;
    E_Menu_Item *mi;
+   Ecore_List* interfaces = NULL;
+   int interface_count = 0;
+   char* interface_name = NULL;
+
+   /* Setup Menus */
+   face->menu                   = e_menu_new();
+   face->menu_cpu               = e_menu_new();
+   face->menu_cpu_interval      = e_menu_new();
+   face->menu_memory            = e_menu_new();
+   face->menu_memory_interval   = e_menu_new();
+   face->menu_network           = e_menu_new();
+   face->menu_network_interval  = e_menu_new();
+   face->menu_network_interface = e_menu_new();
+   
+   /* Main Menu Items */
+   mi = e_menu_item_new(face->menu);
+   e_menu_item_label_set(mi, _("Edit Mode"));
+   e_menu_item_callback_set(mi, _monitor_face_cb_menu_edit, face);
 
-   mn = e_menu_new();
-   face->menu = mn;
+   /* CPU Menu */
+   mi = e_menu_item_new(face->menu);
+   e_menu_item_label_set(mi, _("CPU"));
+   e_menu_item_submenu_set(mi, face->menu_cpu);
+
+   mi = e_menu_item_new(face->menu_cpu);
+   e_menu_item_label_set(mi, _("Set Interval"));
+   e_menu_item_submenu_set(mi, face->menu_cpu_interval);
+
+   /* CPU Menu Items */
+   mi = e_menu_item_new(face->menu_cpu_interval);
+   e_menu_item_label_set(mi, _("Check Fast (1 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->cpu_interval == 1.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_cpu_interval_cb_fast, face);
+
+   mi = e_menu_item_new(face->menu_cpu_interval);
+   e_menu_item_label_set(mi, _("Check Medium (5 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->cpu_interval == 5.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_cpu_interval_cb_medium, face);
+
+   mi = e_menu_item_new(face->menu_cpu_interval);
+   e_menu_item_label_set(mi, _("Check Normal (10 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->cpu_interval == 10.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_cpu_interval_cb_normal, face);
+
+   mi = e_menu_item_new(face->menu_cpu_interval);
+   e_menu_item_label_set(mi, _("Check Slow (30 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->cpu_interval == 30.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_cpu_interval_cb_slow, face);
+
+   mi = e_menu_item_new(face->menu_cpu_interval);
+   e_menu_item_label_set(mi, _("Check Very Slow (60 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->cpu_interval == 60.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_cpu_interval_cb_very_slow, face);
+
+   /* Memory Menu */
+   mi = e_menu_item_new(face->menu);
+   e_menu_item_label_set(mi, _("Memory"));
+   e_menu_item_submenu_set(mi, face->menu_memory);
+
+   mi = e_menu_item_new(face->menu_memory);
+   e_menu_item_label_set(mi, _("Set Interval"));
+   e_menu_item_submenu_set(mi, face->menu_memory_interval);
+
+   /* Memory Interval Menu Items */
+   mi = e_menu_item_new(face->menu_memory_interval);
+   e_menu_item_label_set(mi, _("Check Fast (1 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->mem_interval == 1.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_mem_interval_cb_fast, face);
+
+   mi = e_menu_item_new(face->menu_memory_interval);
+   e_menu_item_label_set(mi, _("Check Medium (5 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->mem_interval == 5.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_mem_interval_cb_medium, face);
+
+   mi = e_menu_item_new(face->menu_memory_interval);
+   e_menu_item_label_set(mi, _("Check Normal (10 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->mem_interval == 10.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_mem_interval_cb_normal, face);
+
+   mi = e_menu_item_new(face->menu_memory_interval);
+   e_menu_item_label_set(mi, _("Check Slow (30 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->mem_interval == 30.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_mem_interval_cb_slow, face);
+
+   mi = e_menu_item_new(face->menu_memory_interval);
+   e_menu_item_label_set(mi, _("Check Very Slow (60 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->mem_interval == 60.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_mem_interval_cb_very_slow, face);
+   
+   /* Memory Menu Items */
+   mi = e_menu_item_new(face->menu_memory);
+   e_menu_item_label_set(mi, _("Ignore Cached"));
+   e_menu_item_check_set(mi, 1);
+   if (face->conf->mem_real_ignore_cached) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_mem_real_ignore_cached_set_cb, face);
 
-   /* Enabled 
-   mi = e_menu_item_new(mn);
-   e_menu_item_label_set(mi, "Enabled");
+   mi = e_menu_item_new(face->menu_memory);
+   e_menu_item_label_set(mi, _("Ignore Buffers"));
    e_menu_item_check_set(mi, 1);
-   if (face->conf->enabled) e_menu_item_toggle_set(mi, 1);
-   e_menu_item_callback_set(mi, _monitor_face_cb_menu_enabled, face);
-   //*/
-
-   /* Edit */
-   mi = e_menu_item_new(mn);
-   e_menu_item_label_set(mi, "Edit Mode");
-   e_menu_item_callback_set(mi, _monitor_face_cb_menu_edit, face);
+   if (face->conf->mem_real_ignore_buffers) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_mem_real_ignore_buffers_set_cb, face);
+
+   /* Network Menu */
+   mi = e_menu_item_new(face->menu);
+   e_menu_item_label_set(mi, _("Network"));
+   e_menu_item_submenu_set(mi, face->menu_network);
+   
+   mi = e_menu_item_new(face->menu_network);
+   e_menu_item_label_set(mi, _("Set Interval"));
+   e_menu_item_submenu_set(mi, face->menu_network_interval);
+
+   mi = e_menu_item_new(face->menu_network);
+   e_menu_item_label_set(mi, _("Select Interface"));
+   e_menu_item_submenu_set(mi, face->menu_network_interface);
+
+   interfaces = ecore_list_new ();
+   interface_count = net_interfaces_get (interfaces);
+      
+   ecore_list_goto_first(interfaces);
+
+   while ((interface_name = ecore_list_current(interfaces)))
+      {
+
+         mi = e_menu_item_new(face->menu_network_interface);
+         e_menu_item_label_set(mi, _(interface_name));
+         e_menu_item_radio_set(mi, 1);
+         e_menu_item_radio_group_set(mi, 1);
+         if (!strcmp(face->conf->net_interface, interface_name))
+            e_menu_item_toggle_set(mi, 1);
+         e_menu_item_callback_set(mi, _monitor_net_interface_cb, face);
+
+	 free(interface_name);
+	 ecore_list_remove(interfaces);
+      }
+
+   ecore_list_destroy(interfaces);
+
+   /* Network Menu Items */
+   mi = e_menu_item_new(face->menu_network_interval);
+   e_menu_item_label_set(mi, _("Check Fast (1 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->net_interval == 1.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_net_interval_cb_fast, face);
+
+   mi = e_menu_item_new(face->menu_network_interval);
+   e_menu_item_label_set(mi, _("Check Medium (5 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->net_interval == 5.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_net_interval_cb_medium, face);
+
+   mi = e_menu_item_new(face->menu_network_interval);
+   e_menu_item_label_set(mi, _("Check Normal (10 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->net_interval == 10.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_net_interval_cb_normal, face);
+
+   mi = e_menu_item_new(face->menu_network_interval);
+   e_menu_item_label_set(mi, _("Check Slow (30 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->net_interval == 30.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_net_interval_cb_slow, face);
+
+   mi = e_menu_item_new(face->menu_network_interval);
+   e_menu_item_label_set(mi, _("Check Very Slow (60 sec)"));
+   e_menu_item_radio_set(mi, 1);
+   e_menu_item_radio_group_set(mi, 1);
+   if (face->conf->net_interval == 60.0) e_menu_item_toggle_set(mi, 1);
+   e_menu_item_callback_set(mi, _monitor_net_interval_cb_very_slow, face);
+
 }
 
 static void
@@ -612,6 +883,59 @@
 }
 
 static void
+_monitor_mem_real_ignore_buffers_set_cb(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+
+   face = data;
+   unsigned char enabled;
+
+   enabled = e_menu_item_toggle_get(mi);
+   
+   if (!enabled) {
+      /* Uncheck */
+      face->conf->mem_real_ignore_buffers = 0;
+      mem_real_ignore_buffers_set(face->conf->mem_real_ignore_buffers);
+      e_menu_item_toggle_set(mi, face->conf->mem_real_ignore_buffers);
+   }
+   else
+   {
+      /* Check */
+      face->conf->mem_real_ignore_buffers = 1;
+      mem_real_ignore_buffers_set(face->conf->mem_real_ignore_buffers);
+      e_menu_item_toggle_set(mi, face->conf->mem_real_ignore_buffers);
+   }
+   e_config_save_queue();
+}
+static void
+_monitor_mem_real_ignore_cached_set_cb(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{ 
+   Monitor_Face *face;
+
+   face = data;
+   unsigned char enabled;
+
+   enabled = e_menu_item_toggle_get(mi);
+   
+   if (!enabled) {
+      /* Uncheck */
+      face->conf->mem_real_ignore_cached = 0;
+      mem_real_ignore_cached_set(face->conf->mem_real_ignore_cached);
+      e_menu_item_toggle_set(mi, face->conf->mem_real_ignore_cached);
+   }
+   else
+   {
+      /* Check */
+      face->conf->mem_real_ignore_cached = 1;
+      mem_real_ignore_cached_set(face->conf->mem_real_ignore_cached);
+      e_menu_item_toggle_set(mi, face->conf->mem_real_ignore_cached);
+   }
+   e_config_save_queue();
+}
+
+static void
 _monitor_face_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, 
 			    void *event_info)
 {
@@ -652,3 +976,205 @@
 			   void *event_info)
 {
 }
+
+static void
+_monitor_mem_interval_cb_fast(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->mem_interval = 1.0;
+   flow_chart_update_rate_set(flow_chart_mem_real, face->conf->mem_interval);
+   flow_chart_update_rate_set(flow_chart_mem_swap, face->conf->mem_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_mem_interval_cb_medium(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->mem_interval = 5.0;
+   flow_chart_update_rate_set(flow_chart_mem_real, face->conf->mem_interval);
+   flow_chart_update_rate_set(flow_chart_mem_swap, face->conf->mem_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_mem_interval_cb_normal(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->mem_interval = 10.0;
+   flow_chart_update_rate_set(flow_chart_mem_real, face->conf->mem_interval);
+   flow_chart_update_rate_set(flow_chart_mem_swap, face->conf->mem_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_mem_interval_cb_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->mem_interval = 30.0;
+   flow_chart_update_rate_set(flow_chart_mem_real, face->conf->mem_interval);
+   flow_chart_update_rate_set(flow_chart_mem_swap, face->conf->mem_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_mem_interval_cb_very_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->mem_interval = 60.0;
+   flow_chart_update_rate_set(flow_chart_mem_real, face->conf->mem_interval);
+   flow_chart_update_rate_set(flow_chart_mem_swap, face->conf->mem_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_cpu_interval_cb_fast(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->cpu_interval = 1.0;
+   flow_chart_update_rate_set(flow_chart_cpu, face->conf->cpu_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_cpu_interval_cb_medium(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->cpu_interval = 5.0;
+   flow_chart_update_rate_set(flow_chart_cpu, face->conf->cpu_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_cpu_interval_cb_normal(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->cpu_interval = 10.0;
+   flow_chart_update_rate_set(flow_chart_cpu, face->conf->cpu_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_cpu_interval_cb_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->cpu_interval = 30.0;
+   flow_chart_update_rate_set(flow_chart_cpu, face->conf->cpu_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_cpu_interval_cb_very_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->cpu_interval = 60.0;
+   flow_chart_update_rate_set(flow_chart_cpu, face->conf->cpu_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_net_interval_cb_fast(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->net_interval = 1.0;
+   flow_chart_update_rate_set(flow_chart_net_in, face->conf->net_interval);
+   flow_chart_update_rate_set(flow_chart_net_out, face->conf->net_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_net_interval_cb_medium(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->net_interval = 5.0;
+   flow_chart_update_rate_set(flow_chart_net_in, face->conf->net_interval);
+   flow_chart_update_rate_set(flow_chart_net_out, face->conf->net_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_net_interval_cb_normal(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->net_interval = 10.0;
+   flow_chart_update_rate_set(flow_chart_net_in, face->conf->net_interval);
+   flow_chart_update_rate_set(flow_chart_net_out, face->conf->net_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_net_interval_cb_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->net_interval = 30.0;
+   flow_chart_update_rate_set(flow_chart_net_in, face->conf->net_interval);
+   flow_chart_update_rate_set(flow_chart_net_out, face->conf->net_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_net_interval_cb_very_slow(void *data, E_Menu *m,
+					  E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->net_interval = 60.0;
+   flow_chart_update_rate_set(flow_chart_net_in, face->conf->net_interval);
+   flow_chart_update_rate_set(flow_chart_net_out, face->conf->net_interval);
+   e_config_save_queue();
+}
+
+static void
+_monitor_net_interface_cb(void *data, E_Menu *m,
+		                 E_Menu_Item *mi)
+{
+   Monitor_Face *face;
+   face = data;
+
+   face->conf->net_interface = strdup(mi->label);
+   net_interface_set(face->conf->net_interface);
+   e_config_save_queue();
+}
Index: e17/apps/e_modules/src/modules/monitor/e_mod_main.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_modules/src/modules/monitor/e_mod_main.h,v
retrieving revision 1.2
diff -b -u -3 -r1.2 e_mod_main.h
--- e17/apps/e_modules/src/modules/monitor/e_mod_main.h	19 Jul 2005 11:38:21 -0000	1.2
+++ e17/apps/e_modules/src/modules/monitor/e_mod_main.h	21 Jul 2005 00:37:50 -0000
@@ -4,6 +4,7 @@
 
 
 #include <e.h>
+#include <Ecore.h>
 
 #include "flow_chart.h"
 #include "linux_2.6.h"
@@ -21,6 +22,15 @@
 struct _Config_Face
 {
    unsigned char enabled;
+
+   double cpu_interval;
+   double mem_interval;
+   double net_interval;
+   
+   char *net_interface;
+
+   int mem_real_ignore_cached;
+   int mem_real_ignore_buffers;
 };
 
 struct _Monitor
@@ -35,19 +45,21 @@
 {
   E_Container *con;
   E_Menu      *menu;
+  E_Menu      *menu_cpu;
+  E_Menu      *menu_cpu_interval;
+  E_Menu      *menu_memory;
+  E_Menu      *menu_memory_interval;
+  E_Menu      *menu_network;
+  E_Menu      *menu_network_interval;
+  E_Menu      *menu_network_interface;
   Config_Face *conf;
 
   Evas_Object *cpu, *net, *mem;
   Evas_Object *cpu_ev_obj, *net_ev_obj, *mem_ev_obj;
   Evas_Object *table_object, *monitor_object;
 
-  double cpu_rate;
-  double mem_rate;
-  double net_rate;
-   
   Chart_Container *chart_cpu, *chart_net, *chart_mem;
 
-   
   E_Gadman_Client *gmc;
 };
 
Index: e17/apps/e_modules/src/modules/monitor/flow_chart.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_modules/src/modules/monitor/flow_chart.c,v
retrieving revision 1.1
diff -b -u -3 -r1.1 flow_chart.c
--- e17/apps/e_modules/src/modules/monitor/flow_chart.c	22 May 2005 03:07:06 -0000	1.1
+++ e17/apps/e_modules/src/modules/monitor/flow_chart.c	21 Jul 2005 00:37:50 -0000
@@ -7,7 +7,8 @@
 {
   Flow_Chart *chart = (Flow_Chart *)data;
 
-  Evas_Object *o, *last;
+  Evas_Object *o;
+  Evas_Object *last = NULL;
   Evas_List *l;
   int i, j = 0;
   int value = 0, text_value = 0;
@@ -64,7 +65,7 @@
 
   for(i = x+w; l && j - 2 < w - dist_right - dist_left; l = l->next, j++)
     {
-      Evas_Coord x,y;
+      Evas_Coord y;
       Evas_Object *lo;
 
       lo = (Evas_Object *)evas_list_data(l);
Index: e17/apps/e_modules/src/modules/monitor/flow_chart.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_modules/src/modules/monitor/flow_chart.h,v
retrieving revision 1.1
diff -b -u -3 -r1.1 flow_chart.h
--- e17/apps/e_modules/src/modules/monitor/flow_chart.h	22 May 2005 03:07:06 -0000	1.1
+++ e17/apps/e_modules/src/modules/monitor/flow_chart.h	21 Jul 2005 00:37:50 -0000
@@ -1,6 +1,7 @@
 
 #include <Ecore.h>
 #include <Evas.h>
+#include <Edje.h>
 
 typedef struct _Chart_Container Chart_Container;
 typedef struct _Flow_Chart Flow_Chart;
Index: e17/apps/e_modules/src/modules/monitor/linux_2.6.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_modules/src/modules/monitor/linux_2.6.c,v
retrieving revision 1.3
diff -b -u -3 -r1.3 linux_2.6.c
--- e17/apps/e_modules/src/modules/monitor/linux_2.6.c	19 Jul 2005 11:38:21 -0000	1.3
+++ e17/apps/e_modules/src/modules/monitor/linux_2.6.c	21 Jul 2005 00:37:50 -0000
@@ -14,7 +14,7 @@
     return -1;
 
   while (fscanf (stat, "cp%s %*u %*u %*u %*u %*u %*u %*u %*u\n", 
-			  &tmp) == 1)
+			  (char *)&tmp) == 1)
     {
 	cpu++;
     }
@@ -103,7 +103,7 @@
 long  bytes_out = 0;
 int   in_usage = 0;
 int   out_usage = 0;
-
+int   interface_changed = 1;
 
 int
 get_net_input_output(unsigned long *in, unsigned long *out, const char *dev)
@@ -160,6 +160,19 @@
   
   unsigned long r_total = 0, t_total = 0;
 
+  if (interface_changed)
+     {
+        /* Interface Changed, reset counters! */
+        interface_changed = 0;
+        old_r_total = 0;
+	old_t_total = 0;
+	bytes_in    = 0;
+	bytes_out   = 0;
+	in_usage    = 0;
+	out_usage   = 0;
+	return;
+     }
+		  
   if ((get_net_input_output( &r_total, &t_total, net_dev)) == -1)
     {  
       in_usage = -1;
@@ -214,15 +227,74 @@
   return out_usage;
 }
 
+void net_interface_set(char* interface_name)
+{
+   /* Change Network Interface */
+   net_dev = interface_name;
+   interface_changed = 1;
+}
+
+int
+net_interfaces_get(Ecore_List * ifaces)
+{
+  unsigned long int   dummy;
+
+  char          *iface;
+  char           buf[256];
+  FILE          *stat;
+  int            iface_count = 0;
+  int x = 0;
+
+  stat = fopen ("/proc/net/dev", "r");
+  if (!stat) return 0;
+
+  while (fgets (buf, 256, stat))
+    {
+      int i = 0;
+
+      /* remove : */
+      for(; buf[i] != 0; i++)
+        if(buf[i] == ':')buf[i] = ' ';
+
+      iface = (char *)malloc(sizeof(char) * 64);
+      x = sscanf (buf, 
+		 "%s %*u %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu"
+		 "%lu %lu %lu %lu %lu\n", iface, &dummy, &dummy, 
+		 &dummy, &dummy, &dummy, &dummy, &dummy, &dummy,
+		 &dummy, &dummy, &dummy, &dummy, &dummy, &dummy,
+		 &dummy, &dummy);
+      if (x >= 16)
+      {
+	 ecore_list_append(ifaces, iface);
+	 iface_count++;
+      }
+    }
+  fclose (stat);
+
+  return iface_count;
+
+}
+
 long  mem_real  = 0;
 long  mem_swap  = 0;
 int   mem_real_usage = 0;
 int   mem_swap_usage = 0;
-
+int   mem_real_ignore_buffers = 0;
+int   mem_real_ignore_cached  = 0;
 
 /* Begin memory monitor code */
 
-void memory_check(int ignore_buffers, int ignore_cached)
+void mem_real_ignore_buffers_set(int ignore_buffers)
+{
+   mem_real_ignore_buffers = ignore_buffers;
+}
+
+void mem_real_ignore_cached_set(int ignore_cached)
+{
+   mem_real_ignore_cached = ignore_cached;
+}
+
+void memory_check(void)
 {
    FILE *pmeminfo = NULL;
    int cursor = 0;
@@ -251,11 +323,11 @@
 	 mtotal = value;
        else if (strcmp(field, "MemFree:") == 0)
 	 mfree = value;
-       else if (ignore_buffers && strcmp(field, "Buffers:") == 0)
+       else if (mem_real_ignore_buffers && strcmp(field, "Buffers:") == 0)
 	 mfree += value;
-       else if (ignore_cached && strcmp(field, "Cached:") == 0)
+       else if (mem_real_ignore_cached && strcmp(field, "Cached:") == 0)
 	 mfree += value;
-       else if (ignore_cached && strcmp(field, "SwapCached:") == 0)
+       else if (mem_real_ignore_cached && strcmp(field, "SwapCached:") == 0)
 	 sfree += value;
        else if (strcmp(field, "SwapTotal:") == 0)
 	 stotal = value;
@@ -307,10 +379,7 @@
 int
 mem_real_usage_get(void)
 {
-  /* FIXME
-   * Need a menu option to change the ignore buffers and ignore cache options
-   */
-  memory_check(0, 0);
+  memory_check();
   return mem_real_usage;
 }
 
Index: e17/apps/e_modules/src/modules/monitor/linux_2.6.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e_modules/src/modules/monitor/linux_2.6.h,v
retrieving revision 1.2
diff -b -u -3 -r1.2 linux_2.6.h
--- e17/apps/e_modules/src/modules/monitor/linux_2.6.h	19 Jul 2005 11:38:21 -0000	1.2
+++ e17/apps/e_modules/src/modules/monitor/linux_2.6.h	21 Jul 2005 00:37:50 -0000
@@ -5,6 +5,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <Ecore.h>
 
 int cpu_usage_get(void);
 
@@ -13,10 +14,15 @@
 int  mem_real_usage_get(void);
 int  mem_swap_usage_get(void);
 
+void mem_real_ignore_buffers_set(int ignore_buffers);
+void mem_real_ignore_cached_set(int ignore_cached);
+
 int  net_in_usage_get(void);
 long net_bytes_in_get(void);
 int  net_out_usage_get(void);
 long net_bytes_out_get(void);
 
+int  net_interfaces_get(Ecore_List * ifaces);
+void net_interface_set(char* interface_name);
 
 #endif /* LINUX_2_6 */

Reply via email to