From 1b891d8974be3ea75ce1ed75f16ad15f583a5bfe Mon Sep 17 00:00:00 2001 From: sebastid Date: Wed, 9 Feb 2005 12:14:08 +0000 Subject: [PATCH] Move action from Battery_Face to Battery (We only need to check the battery once, even if there are multiple faces). Clean up battery check. SVN revision: 13259 --- src/modules/battery/e_mod_main.c | 612 +++++++++++++++++-------------- src/modules/battery/e_mod_main.h | 64 +++- 2 files changed, 385 insertions(+), 291 deletions(-) diff --git a/src/modules/battery/e_mod_main.c b/src/modules/battery/e_mod_main.c index 658a0d90a..f6da4cec0 100644 --- a/src/modules/battery/e_mod_main.c +++ b/src/modules/battery/e_mod_main.c @@ -1,32 +1,39 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ #include "e.h" #include "e_mod_main.h" /* TODO List: * - * should support proepr resize and move handles in the edje. - * + * fix menu pr. face + * separate face from battery + * */ /* module private routines */ static Battery *_battery_init(E_Module *m); static void _battery_shutdown(Battery *e); -static E_Menu *_battery_config_menu_new(Battery *e); -static void _battery_config_menu_del(Battery *e, E_Menu *m); +static void _battery_config_menu_new(Battery *e); +static int _battery_cb_check(void *data); +static Status *_battery_linux_acpi_check(Battery *ef); +static Status *_battery_linux_apm_check(Battery *ef); + static void _battery_face_init(Battery_Face *ef); static void _battery_face_free(Battery_Face *ef); -static void _battery_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change); -static void _battery_cb_face_down(void *data, Evas *e, Evas_Object *obj, void *event_info); -static int _battery_cb_check(void *data); -static int _battery_linux_acpi_check(Battery_Face *ef); -static int _battery_linux_apm_check(Battery_Face *ef); -static void _battery_level_set(Battery_Face *ef, double level); +static void _battery_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change); +static void _battery_face_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _battery_face_level_set(Battery_Face *ef, double level); + +static E_Config_DD *conf_edd; +static E_Config_DD *conf_face_edd; /* public module routines. all modules must have these */ void * init(E_Module *m) { Battery *e; - + /* check module api version */ if (m->api->version < E_MODULE_API_VERSION) { @@ -41,7 +48,7 @@ init(E_Module *m) } /* actually init battery */ e = _battery_init(m); - m->config_menu = _battery_config_menu_new(e); + m->config_menu = e->config_menu; return e; } @@ -49,19 +56,13 @@ int shutdown(E_Module *m) { Battery *e; - + if (m->config_menu) + m->config_menu = NULL; + e = m->data; if (e) - { - if (m->config_menu) - { - _battery_config_menu_del(e, e->config_menu_alarm); - _battery_config_menu_del(e, e->config_menu_poll); - _battery_config_menu_del(e, m->config_menu); - m->config_menu = NULL; - } - _battery_shutdown(e); - } + _battery_shutdown(e); + return 1; } @@ -71,7 +72,7 @@ save(E_Module *m) Battery *e; e = m->data; - e_config_domain_save("module.battery", e->conf_edd, e->conf); + e_config_domain_save("module.battery", conf_edd, e->conf); return 1; } @@ -79,7 +80,7 @@ int info(E_Module *m) { char buf[4096]; - + m->label = strdup("Battery"); snprintf(buf, sizeof(buf), "%s/module_icon.png", e_module_dir_get(m)); m->icon_file = strdup(buf); @@ -102,20 +103,28 @@ static Battery * _battery_init(E_Module *m) { Battery *e; - Evas_List *managers, *l, *l2; - - e = calloc(1, sizeof(Battery)); + Evas_List *managers, *l, *l2, *cl; + + e = E_NEW(Battery, 1); if (!e) return NULL; - - e->conf_edd = E_CONFIG_DD_NEW("Battery_Config", Config); + + conf_face_edd = E_CONFIG_DD_NEW("Battery_Config_Face", Config_Face); +#undef T +#undef D +#define T Config_Face +#define D conf_face_edd + E_CONFIG_VAL(D, T, enabled, INT); + + conf_edd = E_CONFIG_DD_NEW("Battery_Config", Config); #undef T #undef D #define T Config -#define D e->conf_edd +#define D conf_edd E_CONFIG_VAL(D, T, poll_time, DOUBLE); E_CONFIG_VAL(D, T, alarm, INT); - - e->conf = e_config_domain_load("module.battery", e->conf_edd); + E_CONFIG_LIST(D, T, faces, conf_face_edd); + + e->conf = e_config_domain_load("module.battery", conf_edd); if (!e->conf) { e->conf = E_NEW(Config, 1); @@ -124,40 +133,59 @@ _battery_init(E_Module *m) } E_CONFIG_LIMIT(e->conf->poll_time, 0.5, 1000.0); E_CONFIG_LIMIT(e->conf->alarm, 0, 60); - + + _battery_config_menu_new(e); + + e->battery_check_mode = CHECK_NONE; + e->battery_prev_drain = 1; + e->battery_prev_ac = -1; + e->battery_prev_battery = -1; + e->battery_check_timer = ecore_timer_add(e->conf->poll_time, _battery_cb_check, e); + managers = e_manager_list(); for (l = managers; l; l = l->next) { E_Manager *man; - + man = l->data; for (l2 = man->containers; l2; l2 = l2->next) { E_Container *con; Battery_Face *ef; - + con = l2->data; - ef = calloc(1, sizeof(Battery_Face)); + ef = E_NEW(Battery_Face, 1); if (ef) { ef->bat = e; ef->con = con; ef->evas = con->bg_evas; _battery_face_init(ef); - e->face = ef; + e->faces = evas_list_append(e->faces, ef); } } } + + _battery_cb_check(e); + return e; } static void _battery_shutdown(Battery *e) { + Evas_List *l; + free(e->conf); - E_CONFIG_DD_FREE(e->conf_edd); - - _battery_face_free(e->face); + E_CONFIG_DD_FREE(conf_edd); + E_CONFIG_DD_FREE(conf_face_edd); + + for (l = e->faces; l; l = l->next) + _battery_face_free(l->data); + evas_list_free(e->faces); + + ecore_timer_del(e->battery_check_timer); + e_object_del(E_OBJECT(e->config_menu)); free(e); } @@ -165,7 +193,7 @@ static void _battery_menu_alarm_10(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->alarm = 10; } @@ -174,7 +202,7 @@ static void _battery_menu_alarm_20(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->alarm = 20; } @@ -183,7 +211,7 @@ static void _battery_menu_alarm_30(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->alarm = 30; } @@ -192,7 +220,7 @@ static void _battery_menu_alarm_40(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->alarm = 40; } @@ -201,7 +229,7 @@ static void _battery_menu_alarm_50(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->alarm = 50; } @@ -210,7 +238,7 @@ static void _battery_menu_alarm_60(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->alarm = 60; } @@ -219,7 +247,7 @@ static void _battery_menu_alarm_disable(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->alarm = 0; } @@ -228,11 +256,11 @@ static void _battery_menu_fast(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->poll_time = 1.0; - ecore_timer_del(e->face->battery_check_timer); - e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + ecore_timer_del(e->battery_check_timer); + e->battery_check_timer = ecore_timer_add(e->conf->poll_time, _battery_cb_check, e); e_config_save_queue(); } @@ -240,11 +268,11 @@ static void _battery_menu_medium(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->poll_time = 5.0; - ecore_timer_del(e->face->battery_check_timer); - e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + ecore_timer_del(e->battery_check_timer); + e->battery_check_timer = ecore_timer_add(e->conf->poll_time, _battery_cb_check, e); e_config_save_queue(); } @@ -252,11 +280,11 @@ static void _battery_menu_normal(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->poll_time = 10.0; - ecore_timer_del(e->face->battery_check_timer); - e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + ecore_timer_del(e->battery_check_timer); + e->battery_check_timer = ecore_timer_add(e->conf->poll_time, _battery_cb_check, e); e_config_save_queue(); } @@ -264,11 +292,11 @@ static void _battery_menu_slow(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->poll_time = 30.0; - ecore_timer_del(e->face->battery_check_timer); - e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + ecore_timer_del(e->battery_check_timer); + e->battery_check_timer = ecore_timer_add(e->conf->poll_time, _battery_cb_check, e); e_config_save_queue(); } @@ -276,89 +304,89 @@ static void _battery_menu_very_slow(void *data, E_Menu *m, E_Menu_Item *mi) { Battery *e; - + e = data; e->conf->poll_time = 60.0; - ecore_timer_del(e->face->battery_check_timer); - e->face->battery_check_timer = ecore_timer_add(e->face->bat->conf->poll_time, _battery_cb_check, e->face); + ecore_timer_del(e->battery_check_timer); + e->battery_check_timer = ecore_timer_add(e->conf->poll_time, _battery_cb_check, e); e_config_save_queue(); } -static E_Menu * +static void _battery_config_menu_new(Battery *e) { - E_Menu *mn; + E_Menu *mn, *config_menu_alarm, *config_menu_poll; E_Menu_Item *mi; mn = e_menu_new(); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Disable"); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (e->conf->alarm == 0) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_alarm_disable, e); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "10 mins"); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (e->conf->alarm == 10) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_alarm_10, e); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "20 mins"); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (e->conf->alarm == 20) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_alarm_20, e); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "30 mins"); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (e->conf->alarm == 30) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_alarm_30, e); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "40 mins"); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (e->conf->alarm == 40) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_alarm_40, e); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "50 mins"); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (e->conf->alarm == 50) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_alarm_50, e); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "1 hour"); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 1); if (e->conf->alarm == 60) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_alarm_60, e); - - e->config_menu_alarm = mn; - + + config_menu_alarm = mn; + mn = e_menu_new(); - + mi = e_menu_item_new(mn); 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 (e->conf->poll_time == 1.0) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_fast, e); - + mi = e_menu_item_new(mn); 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 (e->conf->poll_time == 5.0) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_medium, e); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Check Normal (10 sec)"); e_menu_item_radio_set(mi, 1); @@ -380,34 +408,26 @@ _battery_config_menu_new(Battery *e) if (e->conf->poll_time == 60.0) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _battery_menu_very_slow, e); - e->config_menu_poll = mn; - + config_menu_poll = mn; + mn = e_menu_new(); - + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Set Poll Time"); - e_menu_item_submenu_set(mi, e->config_menu_poll); - + e_menu_item_submenu_set(mi, config_menu_poll); + mi = e_menu_item_new(mn); e_menu_item_label_set(mi, "Set Alarm"); - e_menu_item_submenu_set(mi, e->config_menu_alarm); - - e->config_menu = mn; - - return mn; -} + e_menu_item_submenu_set(mi, config_menu_alarm); -static void -_battery_config_menu_del(Battery *e, E_Menu *m) -{ - e_object_del(E_OBJECT(m)); + e->config_menu = mn; } static void _battery_face_init(Battery_Face *ef) { Evas_Object *o; - + evas_event_freeze(ef->evas); o = edje_object_add(ef->evas); ef->bat_object = o; @@ -417,22 +437,14 @@ _battery_face_init(Battery_Face *ef) e_path_find(path_themes, "default.eet"), "modules/battery/main"); evas_object_show(o); - + o = evas_object_rectangle_add(ef->evas); ef->event_object = o; evas_object_layer_set(o, 2); 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, _battery_cb_face_down, ef); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _battery_face_cb_mouse_down, ef); evas_object_show(o); - - ef->battery_check_mode = CHECK_NONE; - ef->battery_prev_drain = 1; - ef->battery_prev_ac = -1; - ef->battery_prev_battery = -1; - ef->battery_check_timer = ecore_timer_add(ef->bat->conf->poll_time, _battery_cb_check, ef); - - _battery_cb_check(ef); ef->gmc = e_gadman_client_new(ef->con->gadman); e_gadman_client_domain_set(ef->gmc, "module.battery", 0); @@ -447,7 +459,7 @@ _battery_face_init(Battery_Face *ef) e_gadman_client_auto_size_set(ef->gmc, 64, 64); e_gadman_client_align_set(ef->gmc, 1.0, 1.0); e_gadman_client_resize(ef->gmc, 64, 64); - e_gadman_client_change_func_set(ef->gmc, _battery_cb_gmc_change, ef); + e_gadman_client_change_func_set(ef->gmc, _battery_face_cb_gmc_change, ef); e_gadman_client_load(ef->gmc); evas_event_thaw(ef->evas); } @@ -455,7 +467,6 @@ _battery_face_init(Battery_Face *ef) static void _battery_face_free(Battery_Face *ef) { - ecore_timer_del(ef->battery_check_timer); e_object_del(E_OBJECT(ef->gmc)); evas_object_del(ef->bat_object); evas_object_del(ef->event_object); @@ -463,7 +474,7 @@ _battery_face_free(Battery_Face *ef) } static void -_battery_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change) +_battery_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change) { Battery_Face *ef; Evas_Coord x, y, w, h; @@ -485,11 +496,11 @@ _battery_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change) } static void -_battery_cb_face_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +_battery_face_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Down *ev; Battery_Face *ef; - + ev = event_info; ef = data; if (ev->button == 3) @@ -504,9 +515,11 @@ _battery_cb_face_down(void *data, Evas *e, Evas_Object *obj, void *event_info) static int _battery_cb_check(void *data) { - Battery_Face *ef; - int ret = 0; - + Battery *ef; + Battery_Face *face; + Evas_List *l; + Status *ret = NULL; + ef = data; if (ef->battery_check_mode == 0) { @@ -526,53 +539,144 @@ _battery_cb_check(void *data) default: break; } - if (!ret) + if (ret) { - if (ef->battery_prev_battery != -2) + if (ret->has_battery) { - edje_object_signal_emit(ef->bat_object, "unknown", ""); - ef->battery_prev_battery = -2; + if (ret->state == BATTERY_STATE_CHARGING) + { + for (l = ef->faces; l; l = l->next) + { + face = l->data; + if (ef->battery_prev_ac != 1) + edje_object_signal_emit(face->bat_object, "charge", ""); + edje_object_signal_emit(face->bat_object, "pulsestop", ""); + edje_object_part_text_set(face->bat_object, "reading", ret->reading); + edje_object_part_text_set(face->bat_object, "time", ret->time); + _battery_face_level_set(face, ret->level); + + } + ef->battery_prev_ac = 1; + } + else if (ret->state == BATTERY_STATE_DISCHARGING) + { + for (l = ef->faces; l; l = l->next) + { + face = l->data; + if (ef->battery_prev_ac != 0) + edje_object_signal_emit(face->bat_object, "discharge", ""); + if (ret->alarm) + { + if (!ef->alarm_triggered) + { + e_error_dialog_show("Battery Running Low", + "Your battery is running low.\n" + "You may wish to switch to an AC source."); + } + edje_object_signal_emit(face->bat_object, "pulse", ""); + } + edje_object_part_text_set(face->bat_object, "reading", ret->reading); + edje_object_part_text_set(face->bat_object, "time", ret->time); + _battery_face_level_set(face, ret->level); + + } + ef->battery_prev_ac = 0; + if (ret->alarm) + ef->alarm_triggered = 1; + } + else + { + /* ret->state == BATTERY_STATE_NONE */ + for (l = ef->faces; l; l = l->next) + { + face = l->data; + if (ef->battery_prev_ac != 1) + edje_object_signal_emit(face->bat_object, "charge", ""); + if (ef->battery_prev_battery == 0) + edje_object_signal_emit(face->bat_object, "charge", ""); + edje_object_part_text_set(face->bat_object, "reading", ret->reading); + edje_object_part_text_set(face->bat_object, "time", ret->time); + _battery_face_level_set(face, ret->level); + + } + ef->battery_prev_ac = 1; + ef->battery_prev_battery = 1; + } } - edje_object_part_text_set(ef->bat_object, "reading", "NO INFO"); - edje_object_part_text_set(ef->bat_object, "time", "--:--"); + else + { + /* Hasn't battery */ + for (l = ef->faces; l; l = l->next) + { + face = l->data; + if (ef->battery_prev_battery != 0) + edje_object_signal_emit(face->bat_object, "unknown", ""); + edje_object_part_text_set(face->bat_object, "reading", ret->reading); + edje_object_part_text_set(face->bat_object, "time", ret->time); + _battery_face_level_set(face, ret->level); + + } + ef->battery_prev_battery = 0; + } + free(ret->reading); + free(ret->time); + free(ret); + } + else + { + /* Error reading status */ + for (l = ef->faces; l; l = l->next) + { + face = l->data; + + if (ef->battery_prev_battery != -2) + edje_object_signal_emit(face->bat_object, "unknown", ""); + edje_object_part_text_set(face->bat_object, "reading", "NO INFO"); + edje_object_part_text_set(face->bat_object, "time", "--:--"); + _battery_face_level_set(face, (double)(rand() & 0xff) / 255.0); + } + ef->battery_prev_battery = -2; ef->battery_check_mode = CHECK_NONE; - _battery_level_set(ef, (double)(rand() & 0xff) / 255.0); } return 1; } -static int -_battery_linux_acpi_check(Battery_Face *ef) +static Status * +_battery_linux_acpi_check(Battery *ef) { Evas_List *bats; char buf[4096], buf2[4096]; - + int bat_max = 0; int bat_filled = 0; int bat_level = 0; int bat_drain = 1; - + int bat_val = 0; - + char current_status[256]; int discharging = 0; int charging = 0; int battery = 0; - + int design_cap_unknown = 0; int last_full_unknown = 0; int rate_unknown = 0; int level_unknown = 0; - + int hours, minutes; + Status *stat; + + stat = E_NEW(Status, 1); + /* Read some information on first run. */ bats = e_file_ls("/proc/acpi/battery"); - while (bats) + while (bats) { FILE *f; char *name; - + name = bats->data; bats = evas_list_remove_list(bats, bats); if ((!strcmp(name, ".")) || (!strcmp(name, ".."))) @@ -586,7 +690,7 @@ _battery_linux_acpi_check(Battery_Face *ef) { int design_cap = 0; int last_full = 0; - + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s %*s", buf); @@ -609,7 +713,7 @@ _battery_linux_acpi_check(Battery_Face *ef) char charging_state[256]; int rate = 1; int level = 0; - + fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; sscanf(buf2, "%*[^:]: %250s", present); fgets(buf2, sizeof(buf2), f); buf2[sizeof(buf2) - 1] = 0; @@ -633,14 +737,14 @@ _battery_linux_acpi_check(Battery_Face *ef) } free(name); } - + if (ef->battery_prev_drain < 1) ef->battery_prev_drain = 1; if (bat_drain < 1) bat_drain = ef->battery_prev_drain; ef->battery_prev_drain = bat_drain; - + if (bat_filled > 0) bat_val = (100 * bat_level) / bat_filled; else bat_val = 100; - + if (discharging) minutes = (60 * bat_level) / bat_drain; else { @@ -651,208 +755,162 @@ _battery_linux_acpi_check(Battery_Face *ef) } hours = minutes / 60; minutes -= (hours * 60); - + if (hours < 0) hours = 0; if (minutes < 0) minutes = 0; - - if ((charging) || (discharging)) + + if (!battery) { - ef->battery_prev_battery = 1; + stat->has_battery = 0; + stat->state = BATTERY_STATE_NONE; + stat->reading = strdup("NO BAT"); + stat->time = strdup("--:--"); + stat->level = 1.0; + } + else if ((charging) || (discharging)) + { + ef->battery_prev_battery = 1; + stat->has_battery = 1; if (charging) { - if (ef->battery_prev_ac != 1) - { - edje_object_signal_emit(ef->bat_object, "charge", ""); - ef->battery_prev_ac = 1; - } - edje_object_signal_emit(ef->bat_object, "pulsestop", ""); - ef->bat->alarm_triggered = 0; + stat->state = BATTERY_STATE_CHARGING; + ef->alarm_triggered = 0; } else if (discharging) - { - if (ef->battery_prev_ac != 0) - { - edje_object_signal_emit(ef->bat_object, "discharge", ""); - ef->battery_prev_ac = 0; - } - if (((hours * 60) + minutes) <= ef->bat->conf->alarm) - { - if (!ef->bat->alarm_triggered) - { - e_error_dialog_show("Battery Running Low", - "Your battery is running low.\n" - "You may wish to switch to an AC source."); - } - edje_object_signal_emit(ef->bat_object, "pulse", ""); - ef->bat->alarm_triggered = 1; - } - } + { + stat->state = BATTERY_STATE_DISCHARGING; + if (((hours * 60) + minutes) <= ef->conf->alarm) + stat->alarm = 1; + } if (level_unknown) { - edje_object_part_text_set(ef->bat_object, "reading", "BAD DRIVER"); - edje_object_part_text_set(ef->bat_object, "time", "--:--"); - _battery_level_set(ef, 0.0); + stat->reading = strdup("BAD DRIVER"); + stat->time = strdup("--:--"); + stat->level = 0.0; } else if (rate_unknown) { snprintf(buf, sizeof(buf), "%i%%", bat_val); - edje_object_part_text_set(ef->bat_object, "reading", buf); - edje_object_part_text_set(ef->bat_object, "time", "--:--"); - _battery_level_set(ef, (double)bat_val / 100.0); + stat->reading = strdup(buf); + stat->time = strdup("--:--"); + stat->level = (double)bat_val / 100.0; } else { snprintf(buf, sizeof(buf), "%i%%", bat_val); - edje_object_part_text_set(ef->bat_object, "reading", buf); + stat->reading = strdup(buf); snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes); - edje_object_part_text_set(ef->bat_object, "time", buf); - _battery_level_set(ef, (double)bat_val / 100.0); - } - } - else if (!battery) - { - if (ef->battery_prev_battery != 0) - { - edje_object_signal_emit(ef->bat_object, "unknown", ""); - ef->battery_prev_battery = 0; - } - edje_object_part_text_set(ef->bat_object, "reading", "NO BAT"); - edje_object_part_text_set(ef->bat_object, "time", "--:--"); - _battery_level_set(ef, 1.0); + stat->time = strdup(buf); + stat->level = (double)bat_val / 100.0; + } } else { - if (ef->battery_prev_battery == 0) - { - edje_object_signal_emit(ef->bat_object, "charge", ""); - ef->battery_prev_battery = 1; - } - if (ef->battery_prev_ac != 1) - { - edje_object_signal_emit(ef->bat_object, "charge", ""); - ef->battery_prev_ac = 1; - } - edje_object_part_text_set(ef->bat_object, "reading", "FULL"); - edje_object_part_text_set(ef->bat_object, "time", "--:--"); - _battery_level_set(ef, 1.0); + stat->has_battery = 1; + stat->state = BATTERY_STATE_NONE; + stat->reading = strdup("FULL"); + stat->time = strdup("--:--"); + stat->level = 1.0; } - return 1; + return stat; } -static int -_battery_linux_apm_check(Battery_Face *ef) +static Status * +_battery_linux_apm_check(Battery *ef) { FILE *f; char s[256], s1[32], s2[32], s3[32], buf[4096]; int apm_flags, ac_stat, bat_stat, bat_flags, bat_val, time_val; int hours, minutes; - + + Status *stat; + f = fopen("/proc/apm", "r"); - if (!f) return 0; - + if (!f) return NULL; + fgets(s, sizeof(s), f); s[sizeof(s) - 1] = 0; - if (sscanf(s, "%*s %*s %x %x %x %x %s %s %s", + if (sscanf(s, "%*s %*s %x %x %x %x %s %s %s", &apm_flags, &ac_stat, &bat_stat, &bat_flags, s1, s2, s3) != 7) { fclose(f); - return 0; + return NULL; } s1[strlen(s1) - 1] = 0; bat_val = atoi(s1); if (!strcmp(s3, "sec")) time_val = atoi(s2); else if (!strcmp(s3, "min")) time_val = atoi(s2) * 60; fclose(f); - + + stat = E_NEW(Status, 1); + if ((bat_flags != 0xff) && (bat_flags & 0x80)) { - if (ef->battery_prev_battery != 0) - { - edje_object_signal_emit(ef->bat_object, "unknown", ""); - ef->battery_prev_battery = 0; - } - edje_object_part_text_set(ef->bat_object, "reading", "NO BAT"); - edje_object_part_text_set(ef->bat_object, "time", "--:--"); - _battery_level_set(ef, 1.0); + stat->has_battery = 0; + stat->state = BATTERY_STATE_NONE; + stat->reading = strdup("NO BAT"); + stat->time = strdup("--:--"); + stat->level = 1.0; + return stat; + } + + ef->battery_prev_battery = 1; + stat->has_battery = 1; + if (bat_val > 0) + { + snprintf(buf, sizeof(buf), "%i%%", bat_val); + stat->reading = strdup(buf); + stat->level = (double)bat_val / 100.0; } else { - ef->battery_prev_battery = 1; - if (bat_val > 0) + switch (bat_stat) { - snprintf(buf, sizeof(buf), "%i%%", bat_val); - edje_object_part_text_set(ef->bat_object, "reading", buf); - _battery_level_set(ef, (double)bat_val / 100.0); - } - else - { - switch (bat_stat) - { - case 0: - edje_object_part_text_set(ef->bat_object, "reading", "High"); - _battery_level_set(ef, 1.0); - break; - case 1: - edje_object_part_text_set(ef->bat_object, "reading", "Low"); - _battery_level_set(ef, 0.50); - break; - case 2: - edje_object_part_text_set(ef->bat_object, "reading", "Danger"); - _battery_level_set(ef, 0.25); - break; - case 3: - edje_object_part_text_set(ef->bat_object, "reading", "Charge"); - _battery_level_set(ef, 1.0); - break; - } + case 0: + stat->reading = strdup("High"); + stat->level = 1.0; + break; + case 1: + stat->reading = strdup("Low"); + stat->level = 0.5; + break; + case 2: + stat->reading = strdup("Danger"); + stat->level = 0.25; + break; + case 3: + stat->reading = strdup("Charge"); + stat->level = 1.0; + break; } } - + if (ac_stat == 1) { - if ((ac_stat == 1) && (ef->battery_prev_ac == 0)) - { - edje_object_signal_emit(ef->bat_object, "charge", ""); - ef->battery_prev_ac = 1; - } - else if ((ac_stat == 0) && (ef->battery_prev_ac == 1)) - { - edje_object_signal_emit(ef->bat_object, "discharge", ""); - ef->battery_prev_ac = 0; - } - edje_object_part_text_set(ef->bat_object, "time", "--:--"); + stat->state = BATTERY_STATE_CHARGING; + stat->time = strdup("--:--"); } else { - hours = time_val / 3600; - minutes = (time_val / 60) % 60; - snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes); - edje_object_part_text_set(ef->bat_object, "time", buf); - - if (((hours * 60) + minutes) <= ef->bat->conf->alarm) - { - if (!ef->bat->alarm_triggered) - { - e_error_dialog_show("Battery Running Low", - "Your battery is running low.\n" - "You may wish to switch to an AC source."); - } - edje_object_signal_emit(ef->bat_object, "pulse", ""); - ef->bat->alarm_triggered = 1; - } - else - { - edje_object_signal_emit(ef->bat_object, "pulsestop", ""); - ef->bat->alarm_triggered = 0; - } - } - return 1; + /* ac_stat == 0 */ + stat->state = BATTERY_STATE_DISCHARGING; + + hours = time_val / 3600; + minutes = (time_val / 60) % 60; + snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes); + stat->time = strdup(buf); + + if (((hours * 60) + minutes) <= ef->conf->alarm) + stat->alarm = 1; + } + + return stat; } static void -_battery_level_set(Battery_Face *ef, double level) +_battery_face_level_set(Battery_Face *ef, double level) { Edje_Message_Float msg; - + if (level < 0.0) level = 0.0; else if (level > 1.0) level = 1.0; msg.val = level; diff --git a/src/modules/battery/e_mod_main.h b/src/modules/battery/e_mod_main.h index 1a508df09..157a95908 100644 --- a/src/modules/battery/e_mod_main.h +++ b/src/modules/battery/e_mod_main.h @@ -1,10 +1,16 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H typedef struct _Config Config; +typedef struct _Config_Face Config_Face; typedef struct _Battery Battery; typedef struct _Battery_Face Battery_Face; +typedef struct _Status Status; + #define CHECK_NONE 0 #define CHECK_LINUX_ACPI 1 #define CHECK_LINUX_APM 2 @@ -13,18 +19,27 @@ struct _Config { double poll_time; int alarm; + Evas_List *faces; +}; + +struct _Config_Face +{ + unsigned char enabled; }; struct _Battery { - E_Menu *config_menu; - E_Menu *config_menu_alarm; - E_Menu *config_menu_poll; - Battery_Face *face; - - E_Config_DD *conf_edd; + E_Menu *config_menu; + Evas_List *faces; + Config *conf; int alarm_triggered; + + int battery_check_mode; + Ecore_Timer *battery_check_timer; + int battery_prev_drain; + int battery_prev_ac; + int battery_prev_battery; }; struct _Battery_Face @@ -32,19 +47,40 @@ struct _Battery_Face Battery *bat; E_Container *con; Evas *evas; - + Evas_Object *bat_object; Evas_Object *event_object; - - int battery_check_mode; - Ecore_Timer *battery_check_timer; - int battery_prev_drain; - int battery_prev_ac; - int battery_prev_battery; - + E_Gadman_Client *gmc; }; +#define BATTERY_STATE_NONE 0 +#define BATTERY_STATE_CHARGING 1 +#define BATTERY_STATE_DISCHARGING 2 + +struct _Status +{ + /* Low battery */ + unsigned char alarm; + /* Is there a battery? */ + unsigned char has_battery; + /* charging, discharging, none */ + unsigned char state; + /* Battery level */ + double level; + /* Text */ + /* reading == % left */ + char *reading; + /* time == time left to empty / full */ + char *time; + /* Signals */ + /* charge == (ac == on), (fade_clip == default) */ + /* pulsestop == (pulse_clip == default) */ + /* discharge == (ac == off), (fade_clip == default) */ + /* pulse == (pulse_clip == faded), .... */ + /* unknown == (fade_clip == faded) */ +}; + EAPI void *init (E_Module *m); EAPI int shutdown (E_Module *m); EAPI int save (E_Module *m);