Hi,
i have written a patch with which the battery-module can run an command
on alarm.
E.g when the battery drops under 10 min remaining time then you
can initiate the shutdown of the system.

the command is currently executet via the system-fn call. If it is
there a better methode to do it then let me know it.

Regards

Stephan Wezel

-- 
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
? battery_run_command_on_alarm.patch
Index: e_mod_config.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/modules/battery/e_mod_config.c,v
retrieving revision 1.17
diff -u -r1.17 e_mod_config.c
--- e_mod_config.c	20 Apr 2006 11:30:24 -0000	1.17
+++ e_mod_config.c	21 Jun 2006 22:09:51 -0000
@@ -6,6 +6,9 @@
    int show_alert;   
    double poll_time;   
    int alarm_time;
+   char *command_on_critical;
+   int command_on_critical_time;
+   int run_command;
 };
 
 /* Protos */
@@ -15,6 +18,7 @@
 static int           _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
 static Evas_Object   *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
 static int           _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
+static void          onRunCommandCheckChange(void *data, Evas_Object *obj);
 
 void
 _config_battery_module(void) 
@@ -47,6 +51,13 @@
      cfdata->show_alert = 1;
    else 
      cfdata->show_alert = 0;
+   cfdata->command_on_critical = strdup(battery_config->command_on_critical);
+   cfdata->command_on_critical_time = battery_config->command_on_critical_time;
+   if(cfdata->command_on_critical_time > 0)
+       cfdata->run_command = 1;
+   else
+       cfdata->run_command = 0;
+   
 }
 
 static void *
@@ -96,7 +107,7 @@
 static Evas_Object *
 _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) 
 {
-   Evas_Object *o, *of, *ob;
+   Evas_Object *o, *of, *ob, *run_command_check, *run_command_entry;
    
    /* Use Sliders for both cfg options */
    o = e_widget_list_add(evas, 0, 0);
@@ -117,10 +128,38 @@
    ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1, 60, 1, 0, NULL, &(cfdata->alarm_time), 200);
    e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 0, 1, 0);
 
+   run_command_check = e_widget_check_add(evas, _("Run Command on Alert"), &(cfdata->run_command));
+   if (cfdata->run_command)
+      e_widget_check_checked_set(run_command_check, 1);
+   e_widget_frametable_object_append(of, run_command_check, 0, 6, 1, 1, 1, 0, 1, 1);
+   
+   ob = e_widget_label_add(evas, _("Run Command when battery is down to:"));
+   e_widget_frametable_object_append(of, ob, 0, 7, 1, 1, 1, 0, 1, 1);
+   
+   ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 1, 60*3, 1, 0, NULL, &(cfdata->command_on_critical_time), 200);
+   e_widget_frametable_object_append(of, ob, 0, 8, 1, 1, 1, 0, 1, 0);
+   
+   ob = e_widget_label_add(evas, _("Command to run:"));
+   e_widget_frametable_object_append(of, ob, 0, 9, 1, 1, 1, 0, 1, 1);
+   
+   run_command_entry = e_widget_entry_add(evas, &cfdata->command_on_critical);
+   e_widget_on_change_hook_set(run_command_check, onRunCommandCheckChange, run_command_entry);
+   e_widget_disabled_set(run_command_entry, !cfdata->run_command);
+   e_widget_min_size_set(run_command_entry, 150, 1);
+   e_widget_frametable_object_append(of, run_command_entry, 0, 10, 1, 1, 1, 0, 1, 1);
+   
    e_widget_list_object_append(o, of, 1, 1, 0.5);
    return o;
 }
 
+static void
+onRunCommandCheckChange(void *data, Evas_Object *obj)
+{
+   int checked = e_widget_check_checked_get(obj);
+
+   e_widget_disabled_set(data, !checked);
+}
+
 static int 
 _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) 
 {
@@ -130,6 +169,15 @@
      battery_config->alarm = cfdata->alarm_time;
    else 
      battery_config->alarm = 0;
+   if(battery_config->command_on_critical) free(battery_config->command_on_critical);
+   battery_config->command_on_critical = cfdata->command_on_critical;
+   
+   if(cfdata->run_command)
+       battery_config->command_on_critical_time = cfdata->command_on_critical_time;
+   else
+       battery_config->command_on_critical_time = 0;
+   
+   
    _battery_config_updated();
    e_config_save_queue();
    return 1;
Index: e_mod_main.c
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/modules/battery/e_mod_main.c,v
retrieving revision 1.80
diff -u -r1.80 e_mod_main.c
--- e_mod_main.c	7 Jun 2006 23:30:13 -0000	1.80
+++ e_mod_main.c	21 Jun 2006 22:09:52 -0000
@@ -150,7 +150,7 @@
 /***************************************************************************/
 
 /***************************************************************************/
-/**/
+/***/
 static void
 _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
@@ -286,6 +286,12 @@
 		    {
 		       if (battery_config->battery_prev_ac != 0)
 			 edje_object_signal_emit(inst->o_battery, "discharge", "");
+               if(ret->critical && !battery_config->critical_triggered)
+               {
+                   if(strlen(battery_config->command_on_critical) >0)
+                       system(battery_config->command_on_critical);
+                   battery_config->critical_triggered = 1;
+               }
 		       if (ret->alarm)
 			 {
 			    if (!battery_config->alarm_triggered)
@@ -530,6 +536,7 @@
           {
 	     stat->state = BATTERY_STATE_CHARGING;
 	     battery_config->alarm_triggered = 0;
+         battery_config->critical_triggered = 0;
           }
 	else if (discharging)
 	  {
@@ -538,6 +545,8 @@
 	       {
 		  if (((hours * 60) + minutes) <= battery_config->alarm)
 		    stat->alarm = 1;
+          if (((hours * 60) + minutes) <= battery_config->command_on_critical_time)
+		    stat->critical = 1;
 	       }
 	  }
 	if (level_unknown)
@@ -663,6 +672,8 @@
 	  {
 	     if (((hours * 60) + minutes) <= battery_config->alarm)
 	       stat->alarm = 1;
+         if (((hours * 60) + minutes) <= battery_config->command_on_critical_time)
+	       stat->critical = 1;
 	  }
      }
 
@@ -842,6 +853,7 @@
           {
 	     stat->state = BATTERY_STATE_CHARGING;
 	     battery_config->alarm_triggered = 0;
+         battery_config->critical_triggered = 0;
           }
 	else if (discharging)
 	  {
@@ -850,6 +862,8 @@
 	       {
 		  if (((hours * 60) + minutes) <= battery_config->alarm)
 		    stat->alarm = 1;
+          if (((hours * 60) + minutes) <= battery_config->command_on_critical_time)
+	       stat->critical = 1;
 	       }
 	  }
 	stat->level = (double)charge / (double)max_charge;
@@ -997,7 +1011,8 @@
         if (state == BATTERY_STATE_CHARGING)
           {
 	     stat->state = BATTERY_STATE_CHARGING;
-	     battery_config->alarm_triggered = 0;
+         battery_config->alarm_triggered = 0;
+	     battery_config->critical_triggered = 0;
           }
 	else if (state == BATTERY_STATE_DISCHARGING)
 	  {
@@ -1006,6 +1021,8 @@
 	       {
 		  if (((hours * 60) + minutes) <= battery_config->alarm)
 		    stat->alarm = 1;
+          if (((hours * 60) + minutes) <= battery_config->command_on_critical_time)
+	       stat->critical = 1;
 	       }
 	  }
 	if (!level)
@@ -1129,6 +1146,8 @@
 	  {
 	     if (((hours * 60) + minutes) <= battery_config->alarm)
 	       stat->alarm = 1;
+         if (((hours * 60) + minutes) <= battery_config->command_on_critical_time)
+	       stat->critical = 1;
 	  }
      }
    
@@ -1376,6 +1395,8 @@
 #define D conf_edd
    E_CONFIG_VAL(D, T, poll_time, DOUBLE);
    E_CONFIG_VAL(D, T, alarm, INT);
+   E_CONFIG_VAL(D, T, command_on_critical_time, INT);
+   E_CONFIG_VAL(D, T, command_on_critical, STR);
 
    battery_config = e_config_domain_load("module.battery", conf_edd);
    if (!battery_config)
@@ -1383,9 +1404,12 @@
        battery_config = E_NEW(Config, 1);
        battery_config->poll_time = 30.0;
        battery_config->alarm = 30;
+       battery_config->command_on_critical_time = 20;
+       battery_config->command_on_critical = strdup("");
      }
    E_CONFIG_LIMIT(battery_config->poll_time, 0.5, 1000.0);
    E_CONFIG_LIMIT(battery_config->alarm, 0, 60);
+   E_CONFIG_LIMIT(battery_config->command_on_critical_time, 0, 60*3);
    
    battery_config->battery_check_mode = CHECK_NONE;
    battery_config->battery_prev_drain = 1;
Index: e_mod_main.h
===================================================================
RCS file: /var/cvs/e/e17/apps/e/src/modules/battery/e_mod_main.h,v
retrieving revision 1.25
diff -u -r1.25 e_mod_main.h
--- e_mod_main.h	6 Jun 2006 15:19:36 -0000	1.25
+++ e_mod_main.h	21 Jun 2006 22:09:52 -0000
@@ -17,12 +17,15 @@
    /* saved * loaded config values */
    double           poll_time;
    int              alarm;
+   int              command_on_critical_time;
+   char             *command_on_critical;
    /* just config state */
    E_Module        *module;
    E_Config_Dialog *config_dialog;
    Evas_List       *instances;
    E_Menu          *menu;
    int              alarm_triggered;
+   int              critical_triggered;
    int              battery_check_mode;
    Ecore_Timer     *battery_check_timer;
    int              battery_prev_drain;
@@ -45,6 +48,9 @@
 {
    /* Low battery */
    unsigned char alarm;
+   /* critical battery */
+   unsigned char critical;
+   
    /* Is there a battery? */
    unsigned char has_battery;
    /* charging, discharging, none */
All the advantages of Linux Managed Hosting--Without the Cost and Risk!
Fully trained technicians. The highest number of Red Hat certifications in
the hosting industry. Fanatical Support. Click to learn more
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to