diff --git a/src/modules/battery/e_mod_main.c b/src/modules/battery/e_mod_main.c index 2af70c62a..ce7896410 100644 --- a/src/modules/battery/e_mod_main.c +++ b/src/modules/battery/e_mod_main.c @@ -4,6 +4,10 @@ #include "e.h" #include "e_mod_main.h" +#define UNKNOWN 0 +#define NOHAL 1 +#define HAL 2 + #define POPUP_DEBOUNCE_CYCLES 2 /* gadcon requirements */ @@ -36,6 +40,7 @@ struct _Instance E_Gadcon_Popup *warning; }; +static void _battery_update(int full, int time_left, int have_battery, int have_power); static int _battery_cb_exe_data(void *data, int type, void *event); static int _battery_cb_exe_del(void *data, int type, void *event); static void _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); @@ -230,6 +235,483 @@ _battery_face_cb_menu_configure(void *data, E_Menu *m, E_Menu_Item *mi) e_int_config_battery_module(m->zone->container, NULL); } +/* dbus/hal stuff */ +typedef struct _Hal_Battery Hal_Battery; +typedef struct _Hal_Ac_Adapter Hal_Ac_Adapter; + +struct _Hal_Battery +{ + const char *udi; + E_DBus_Signal_Handler *prop_change; + int present; + int percent; + int can_charge; + int current_charge; + int design_charge; + int last_full_charge; + int charge_rate; + int time_left; + int is_charging; + int is_discharging; + const char *charge_units; + const char *technology; + const char *model; + const char *vendor; + const char *type; +}; + +struct _Hal_Ac_Adapter +{ + const char *udi; + E_DBus_Signal_Handler *prop_change; + int present; + const char *product; +}; + +static void _battery_hal_update(void); +static void _battery_hal_shutdown(void); +static void _battery_hal_battery_props(void *data, void *reply_data, DBusError *error); +static void _battery_hal_ac_adapter_props(void *data, void *reply_data, DBusError *error); +static void _battery_hal_battery_property_changed(void *data, DBusMessage *msg); +static void _battery_hal_ac_adatper_property_changed(void *data, DBusMessage *msg); +static void _battery_hal_battery_add(const char *udi); +static void _battery_hal_battery_del(const char *udi); +static void _battery_hal_ac_adapter_add(const char *udi); +static void _battery_hal_ac_adapter_del(const char *udi); +static void _battery_hal_find_battery(void *user_data, void *reply_data, DBusError *error); +static void _battery_hal_find_ac(void *user_data, void *reply_data, DBusError *error); +static void _battery_hal_is_battery(void *user_data, void *reply_data, DBusError *err); +static void _battery_hal_is_ac_adapter(void *user_data, void *reply_data, DBusError *err); +static void _battery_hal_dev_add(void *data, DBusMessage *msg); +static void _battery_hal_dev_del(void *data, DBusMessage *msg); +static void _battery_hal_have_hal(void *data, DBusMessage *msg, DBusError *err); + +static Eina_List *hal_batteries = NULL; +static Eina_List *hal_ac_adapters = NULL; +static double init_time = 0; + +static void +_battery_hal_update(void) +{ + Eina_List *l; + int full = -1; + int time_left = -1; + int have_battery = 0; + int have_power = 0; + + int batnum = 0; + int acnum = 0; + + for (l = hal_ac_adapters; l; l = l->next) + { + Hal_Battery *hac; + + hac = l->data; + if (hac->present) acnum++; + } + for (l = hal_batteries; l; l = l->next) + { + Hal_Battery *hbat; + + hbat = l->data; + have_battery = 1; + batnum++; + if (hbat->is_charging) have_power = 1; + full += hbat->percent; + if (hbat->time_left > 0) + { + if (time_left < 0) time_left = hbat->time_left; + else time_left += hbat->time_left; + } + } + if (batnum > 0) full /= batnum; + + if ((acnum >= 0) && (batnum == 0)) + _battery_update(full, time_left, have_battery, have_power); + else + { + _battery_update(full, time_left, have_battery, have_power); + e_powersave_mode_set(E_POWERSAVE_MODE_LOW); + } +} + +static void +_battery_hal_shutdown(void) +{ + E_DBus_Connection *conn; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + // FIXME: free all bat/ac adapters, cattery_config stuff etc. + if (battery_config->hal.have) + { + dbus_pending_call_cancel(battery_config->hal.have); + battery_config->hal.have = NULL; + } + if (battery_config->hal.dev_add) + { + e_dbus_signal_handler_del(conn, battery_config->hal.dev_add); + battery_config->hal.dev_add = NULL; + } + if (battery_config->hal.dev_del) + { + e_dbus_signal_handler_del(conn, battery_config->hal.dev_del); + battery_config->hal.dev_del = NULL; + } + while (hal_ac_adapters) + { + Hal_Ac_Adapter *hac; + + hac = hal_ac_adapters->data; + e_dbus_signal_handler_del(conn, hac->prop_change); + eina_stringshare_del(hac->udi); + free(hac); + hal_ac_adapters = eina_list_remove_list(hal_ac_adapters, hal_ac_adapters); + } + while (hal_batteries) + { + Hal_Battery *hbat; + + hbat = hal_batteries->data; + e_dbus_signal_handler_del(conn, hbat->prop_change); + eina_stringshare_del(hbat->udi); + free(hbat); + hal_batteries = eina_list_remove_list(hal_batteries, hal_batteries); + } +} + +static void +_battery_hal_battery_props(void *data, void *reply_data, DBusError *error) +{ + E_Hal_Properties *ret = reply_data; + int err = 0; + int i; + char *str; + Hal_Battery *hbat; + + hbat = data; + +#undef GET_BOOL +#undef GET_INT +#undef GET_STR +#define GET_BOOL(val, s) hbat->val = e_hal_property_bool_get(ret, s, &err) +#define GET_INT(val, s) hbat->val = e_hal_property_int_get(ret, s, &err) +#define GET_STR(val, s) \ + if (hbat->val) eina_stringshare_del(hbat->val); \ + hbat->val = NULL; \ + str = e_hal_property_string_get(ret, s, &err); \ + if (str) \ + { \ + hbat->val = eina_stringshare_add(str); \ + free(str); \ + } + + GET_BOOL(present, "battery.present"); + GET_STR(technology, "battery.reporting.technology"); + GET_STR(model, "battery.model"); + GET_STR(vendor, "battery.vendor"); + GET_STR(type, "battery.type"); + GET_STR(charge_units, "battery.reporting.unit"); + GET_INT(percent, "battery.charge_level.percentage"); + GET_BOOL(can_charge, "battery.is_rechargeable"); + GET_INT(current_charge, "battery.charge_level.current"); + GET_INT(charge_rate, "battery.charge_level.rate"); + GET_INT(design_charge, "battery.charge_level.design"); + GET_INT(last_full_charge, "battery.charge_level.last_full"); + GET_INT(time_left, "battery.remaining_time"); + GET_BOOL(is_charging, "battery.rechargeable.is_charging"); + GET_BOOL(is_discharging, "battery.rechargeable.is_discharging"); + + _battery_hal_update(); +} + +static void +_battery_hal_ac_adapter_props(void *data, void *reply_data, DBusError *error) +{ + E_Hal_Properties *ret = reply_data; + int err = 0; + int i; + char *str; + Hal_Ac_Adapter *hac; + + hac = data; + +#undef GET_BOOL +#undef GET_INT +#undef GET_STR +#define GET_BOOL(val, s) hac->val = e_hal_property_bool_get(ret, s, &err) +#define GET_INT(val, s) hac->val = e_hal_property_int_get(ret, s, &err) +#define GET_STR(val, s) \ + if (hac->val) eina_stringshare_del(hac->val); \ + hac->val = NULL; \ + str = e_hal_property_string_get(ret, s, &err); \ + if (str) \ + { \ + hac->val = eina_stringshare_add(str); \ + free(str); \ + } + + GET_BOOL(present, "ac_adapter.present"); + GET_STR(product, "info.product"); + _battery_hal_update(); +} + +static void +_battery_hal_battery_property_changed(void *data, DBusMessage *msg) +{ + E_DBus_Connection *conn; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + // FIXME: e_dbus doesnt allow us to track this pending call + e_hal_device_get_all_properties(conn, ((Hal_Battery *)data)->udi, + _battery_hal_battery_props, data); +} + +static void +_battery_hal_ac_adapter_property_changed(void *data, DBusMessage *msg) +{ + E_DBus_Connection *conn; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + // FIXME: e_dbus doesnt allow us to track this pending call + e_hal_device_get_all_properties(conn, ((Hal_Ac_Adapter *)data)->udi, + _battery_hal_ac_adapter_props, data); +} + +static void +_battery_hal_battery_add(const char *udi) +{ + E_DBus_Connection *conn; + Hal_Battery *hbat; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + // FIXME: look for battery with same udi - if so delete and replace + hbat = E_NEW(Hal_Battery, 1); + if (!hbat) return; + hbat->udi = eina_stringshare_add(udi); + hal_batteries = eina_list_append(hal_batteries, hbat); + hbat->prop_change = + e_dbus_signal_handler_add(conn, E_HAL_SENDER, udi, + E_HAL_DEVICE_INTERFACE, "PropertyModified", + _battery_hal_battery_property_changed, + hbat); + // FIXME: e_dbus doesnt allow us to track this pending call + e_hal_device_get_all_properties(conn, udi, + _battery_hal_battery_props, hbat); + _battery_hal_update(); +} + +static void +_battery_hal_battery_del(const char *udi) +{ + E_DBus_Connection *conn; + Eina_List *l; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + for (l = hal_batteries; l; l = l->next) + { + Hal_Battery *hbat; + + hbat = l->data; + if (!strcmp(udi, hbat->udi)) + { + e_dbus_signal_handler_del(conn, hbat->prop_change); + eina_stringshare_del(hbat->udi); + free(hbat); + hal_batteries = eina_list_remove_list(hal_batteries, l); + return; + } + } + _battery_hal_update(); +} + +static void +_battery_hal_ac_adapter_add(const char *udi) +{ + E_DBus_Connection *conn; + Hal_Ac_Adapter *hac; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + hac = E_NEW(Hal_Ac_Adapter, 1); + if (!hac) return; + hac->udi = eina_stringshare_add(udi); + hal_ac_adapters = eina_list_append(hal_ac_adapters, hac); + hac->prop_change = + e_dbus_signal_handler_add(conn, E_HAL_SENDER, udi, + E_HAL_DEVICE_INTERFACE, "PropertyModified", + _battery_hal_ac_adapter_property_changed, + hac); + // FIXME: e_dbus doesnt allow us to track this pending call + e_hal_device_get_all_properties(conn, udi, + _battery_hal_ac_adapter_props, hac); + _battery_hal_update(); +} + +static void +_battery_hal_ac_adapter_del(const char *udi) +{ + E_DBus_Connection *conn; + Eina_List *l; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + for (l = hal_ac_adapters; l; l = l->next) + { + Hal_Ac_Adapter *hac; + + hac = l->data; + if (!strcmp(udi, hac->udi)) + { + e_dbus_signal_handler_del(conn, hac->prop_change); + eina_stringshare_del(hac->udi); + free(hac); + hal_ac_adapters = eina_list_remove_list(hal_ac_adapters, l); + return; + } + } + _battery_hal_update(); +} + +static void +_battery_hal_find_battery(void *user_data, void *reply_data, DBusError *error) +{ + char *device; + E_Hal_Manager_Find_Device_By_Capability_Return *ret; + + ret = reply_data; + if (ecore_list_count(ret->strings) < 1) return; + ecore_list_first_goto(ret->strings); + while ((device = ecore_list_next(ret->strings))) + _battery_hal_battery_add(device); +} + +static void +_battery_hal_find_ac(void *user_data, void *reply_data, DBusError *err) +{ + char *device; + E_Hal_Manager_Find_Device_By_Capability_Return *ret; + + ret = reply_data; + if (ecore_list_count(ret->strings) < 1) return; + ecore_list_first_goto(ret->strings); + while ((device = ecore_list_next(ret->strings))) + _battery_hal_ac_adapter_add(device); +} + +static void +_battery_hal_is_battery(void *user_data, void *reply_data, DBusError *err) +{ + char *udi = user_data; + E_Hal_Device_Query_Capability_Return *ret; + + ret = reply_data; + if (dbus_error_is_set(err)) + { + dbus_error_free(err); + goto error; + } + if (ret && ret->boolean) _battery_hal_battery_add(udi); + error: + free(udi); +} + +static void +_battery_hal_is_ac_adapter(void *user_data, void *reply_data, DBusError *err) +{ + char *udi = user_data; + E_Hal_Device_Query_Capability_Return *ret; + + ret = reply_data; + if (dbus_error_is_set(err)) + { + dbus_error_free(err); + goto error; + } + if (ret && ret->boolean) _battery_hal_ac_adapter_add(udi); + error: + free(udi); +} + +static void +_battery_hal_dev_add(void *data, DBusMessage *msg) +{ + DBusError err; + char *udi = NULL; + E_DBus_Connection *conn; + + dbus_error_init(&err); + dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID); + if (!udi) return; + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + // FIXME: e_dbus doesnt allow us to track this pending call + e_hal_device_query_capability(conn, udi, "battery", + _battery_hal_is_battery, strdup(udi)); + e_hal_device_query_capability(conn, udi, "ac_adapter", + _battery_hal_is_ac_adapter, strdup(udi)); +} + +static void +_battery_hal_dev_del(void *data, DBusMessage *msg) +{ + DBusError err; + char *udi = NULL; + + dbus_error_init(&err); + dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID); + if (!udi) return; + _battery_hal_battery_del(udi); + _battery_hal_ac_adapter_del(udi); +} + +static void +_battery_hal_have_hal(void *data, DBusMessage *msg, DBusError *err) +{ + dbus_bool_t ok = 0; + E_DBus_Connection *conn; + + battery_config->hal.have = NULL; + if (dbus_error_is_set(err)) + { + battery_config->have_hal = NOHAL; + _battery_config_updated(); + return; + } + dbus_message_get_args(msg, err, DBUS_TYPE_BOOLEAN, &ok, DBUS_TYPE_INVALID); + if (!ok) + { + battery_config->have_hal = NOHAL; + _battery_config_updated(); + return; + } + battery_config->have_hal = HAL; + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!conn) return; + // FIXME: e_dbus doesnt allow us to track this pending call + e_hal_manager_find_device_by_capability + (conn, "battery", _battery_hal_find_battery, NULL); + e_hal_manager_find_device_by_capability + (conn, "ac_adapter", _battery_hal_find_ac, NULL); + battery_config->hal.dev_add = + e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", + "/org/freedesktop/Hal/Manager", + "org.freedesktop.Hal.Manager", + "DeviceAdded", _battery_hal_dev_add, NULL); + battery_config->hal.dev_del = + e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", + "/org/freedesktop/Hal/Manager", + "org.freedesktop.Hal.Manager", + "DeviceRemoved", _battery_hal_dev_del, NULL); + init_time = ecore_time_get(); +} + +/* end dbus/hal stuff */ + void _battery_config_updated(void) { @@ -243,20 +725,39 @@ _battery_config_updated(void) for (l = battery_config->instances; l; l = l->next) _battery_warning_popup_destroy(l->data); } - - if (battery_config->batget_exe) + if (battery_config->have_hal == UNKNOWN) { - ecore_exe_terminate(battery_config->batget_exe); - ecore_exe_free(battery_config->batget_exe); + if (!e_dbus_bus_get(DBUS_BUS_SYSTEM)) + battery_config->have_hal = NOHAL; } - snprintf(buf, sizeof(buf), "%s/%s/batget %i", - e_module_dir_get(battery_config->module), MODULE_ARCH, - battery_config->poll_interval); - battery_config->batget_exe = - ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_READ | - ECORE_EXE_PIPE_READ_LINE_BUFFERED | - ECORE_EXE_NOT_LEADER, NULL); + if (battery_config->have_hal == NOHAL) + { + if (battery_config->batget_exe) + { + ecore_exe_terminate(battery_config->batget_exe); + ecore_exe_free(battery_config->batget_exe); + } + snprintf(buf, sizeof(buf), "%s/%s/batget %i", + e_module_dir_get(battery_config->module), MODULE_ARCH, + battery_config->poll_interval); + + battery_config->batget_exe = + ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_READ | + ECORE_EXE_PIPE_READ_LINE_BUFFERED | + ECORE_EXE_NOT_LEADER, NULL); + } + else if (battery_config->have_hal == UNKNOWN) + { + E_DBus_Connection *conn; + DBusPendingCall *call; + + conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (conn) + battery_config->hal.have = + e_dbus_name_has_owner(conn, "org.freedesktop.Hal", + _battery_hal_have_hal, NULL); + } } static int @@ -352,6 +853,168 @@ _battery_warning_popup(Instance *inst, int time, double percent) } } +static void +_battery_update(int full, int time_left, int have_battery, int have_power) +{ + Eina_List *l; + static int debounce_popup = 0; + + if (debounce_popup > POPUP_DEBOUNCE_CYCLES) + debounce_popup = 0; + for (l = battery_config->instances; l; l = l->next) + { + Instance *inst; + + inst = l->data; + if (have_power != battery_config->have_power) + { + if (have_power) + edje_object_signal_emit(inst->o_battery, + "e,state,charging", + "e"); + else + { + edje_object_signal_emit(inst->o_battery, + "e,state,discharging", + "e"); + if (inst->popup_battery) + edje_object_signal_emit(inst->popup_battery, + "e,state,discharging", "e"); + } + } + if (have_battery) + { + if (battery_config->full != full) + { + _battery_face_level_set(inst->o_battery, + (double)full / 100.0); + if (inst->popup_battery) + _battery_face_level_set(inst->popup_battery, + (double)full / 100.0); + } + } + else + { + _battery_face_level_set(inst->o_battery, 0.0); + edje_object_part_text_set(inst->o_battery, + "e.text.reading", + _("N/A")); + } + + if (time_left != battery_config->time_left) + { + _battery_face_time_set(inst->o_battery, time_left); + if (inst->popup_battery) + _battery_face_time_set(inst->popup_battery, + time_left); + } + + if (have_battery && (!have_power) && (full != 100) && + ((battery_config->alert && ((time_left / 60) <= battery_config->alert)) || + (battery_config->alert_p && (full <= battery_config->alert_p))) + ) + { + if (++debounce_popup == POPUP_DEBOUNCE_CYCLES) + { + double t; + + t = ecore_time_get() - init_time; + if (t > 5.0) + _battery_warning_popup(inst, time_left, (double)full/100.0); + else + debounce_popup = 0; + } + } + else if (have_power) + _battery_warning_popup_destroy(inst); + } + if (!have_battery) + e_powersave_mode_set(E_POWERSAVE_MODE_LOW); + else + { + if ((have_power) || (full > 95)) + e_powersave_mode_set(E_POWERSAVE_MODE_LOW); + else if (full > 30) + e_powersave_mode_set(E_POWERSAVE_MODE_HIGH); + else + e_powersave_mode_set(E_POWERSAVE_MODE_EXTREME); + } + battery_config->full = full; + battery_config->time_left = time_left; + battery_config->have_battery = have_battery; + battery_config->have_power = have_power; +} + +static int +_battery_cb_exe_data(void *data, int type, void *event) +{ + Ecore_Exe_Event_Data *ev; + + ev = event; + if (ev->exe != battery_config->batget_exe) return 1; + if ((ev->lines) && (ev->lines[0].line)) + { + int i; + + for (i = 0; ev->lines[i].line; i++) + { + if (!strcmp(ev->lines[i].line, "ERROR")) + { + Eina_List *l; + + for (l = battery_config->instances; l; l = l->next) + { + Instance *inst; + + inst = l->data; + edje_object_signal_emit(inst->o_battery, + "e,state,unknown", "e"); + edje_object_part_text_set(inst->o_battery, + "e.text.reading", _("ERROR")); + edje_object_part_text_set(inst->o_battery, + "e.text.time", _("ERROR")); + + if (inst->popup_battery) + { + edje_object_signal_emit(inst->popup_battery, + "e,state,unknown", "e"); + edje_object_part_text_set(inst->popup_battery, + "e.text.reading", _("ERROR")); + edje_object_part_text_set(inst->popup_battery, + "e.text.time", _("ERROR")); + } + } + } + else + { + int full = 0; + int time_left = 0; + int have_battery = 0; + int have_power = 0; + + if (sscanf(ev->lines[i].line, "%i %i %i %i", + &full, &time_left, &have_battery, &have_power) + == 4) + _battery_update(full, time_left, have_battery, have_power); + else + e_powersave_mode_set(E_POWERSAVE_MODE_LOW); + } + } + } + return 0; +} + +static int +_battery_cb_exe_del(void *data, int type, void *event) +{ + Ecore_Exe_Event_Del *ev; + + ev = event; + if (ev->exe != battery_config->batget_exe) return 1; + battery_config->batget_exe = NULL; + return 1; +} + /* module setup */ EAPI E_Module_Api e_modapi = { @@ -444,6 +1107,9 @@ e_modapi_shutdown(E_Module *m) e_object_del(E_OBJECT(battery_config->menu)); battery_config->menu = NULL; } + + _battery_hal_shutdown(); + free(battery_config); battery_config = NULL; E_CONFIG_DD_FREE(conf_edd); @@ -456,153 +1122,3 @@ e_modapi_save(E_Module *m) e_config_domain_save("module.battery", conf_edd, battery_config); return 1; } - -static int -_battery_cb_exe_data(void *data, int type, void *event) -{ - Ecore_Exe_Event_Data *ev; - - ev = event; - if (ev->exe != battery_config->batget_exe) return 1; - if ((ev->lines) && (ev->lines[0].line)) - { - int i; - - for (i = 0; ev->lines[i].line; i++) - { - if (!strcmp(ev->lines[i].line, "ERROR")) - { - Eina_List *l; - - for (l = battery_config->instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - edje_object_signal_emit(inst->o_battery, - "e,state,unknown", "e"); - edje_object_part_text_set(inst->o_battery, - "e.text.reading", _("ERROR")); - edje_object_part_text_set(inst->o_battery, - "e.text.time", _("ERROR")); - - if (inst->popup_battery) - { - edje_object_signal_emit(inst->popup_battery, - "e,state,unknown", "e"); - edje_object_part_text_set(inst->popup_battery, - "e.text.reading", _("ERROR")); - edje_object_part_text_set(inst->popup_battery, - "e.text.time", _("ERROR")); - } - } - } - else - { - int full = 0; - int time_left = 0; - int have_battery = 0; - int have_power = 0; - Eina_List *l; - static int debounce_popup = 0; - - if (debounce_popup > POPUP_DEBOUNCE_CYCLES) - debounce_popup = 0; - - if (sscanf(ev->lines[i].line, "%i %i %i %i", - &full, &time_left, &have_battery, &have_power) - == 4) - { - for (l = battery_config->instances; l; l = l->next) - { - Instance *inst; - - inst = l->data; - if (have_power != battery_config->have_power) - { - if (have_power) - edje_object_signal_emit(inst->o_battery, - "e,state,charging", - "e"); - else - { - edje_object_signal_emit(inst->o_battery, - "e,state,discharging", - "e"); - if (inst->popup_battery) - edje_object_signal_emit(inst->popup_battery, - "e,state,discharging", "e"); - } - } - if (have_battery) - { - if (battery_config->full != full) - { - _battery_face_level_set(inst->o_battery, - (double)full / 100.0); - if (inst->popup_battery) - _battery_face_level_set(inst->popup_battery, - (double)full / 100.0); - } - } - else - { - _battery_face_level_set(inst->o_battery, 0.0); - edje_object_part_text_set(inst->o_battery, - "e.text.reading", - _("N/A")); - } - - if (time_left != battery_config->time_left) - { - _battery_face_time_set(inst->o_battery, time_left); - if (inst->popup_battery) - _battery_face_time_set(inst->popup_battery, - time_left); - } - - if (have_battery && !have_power && (full != 100) && - ((battery_config->alert && ((time_left/60) <= battery_config->alert)) || - (battery_config->alert_p && (full <= battery_config->alert_p))) - ) - { - if (++debounce_popup == POPUP_DEBOUNCE_CYCLES) - _battery_warning_popup(inst, time_left, (double)full/100.0); - } - else if (have_power) - _battery_warning_popup_destroy(inst); - } - if (!have_battery) - e_powersave_mode_set(E_POWERSAVE_MODE_LOW); - else - { - if ((have_power) || (full > 95)) - e_powersave_mode_set(E_POWERSAVE_MODE_LOW); - else if (full > 30) - e_powersave_mode_set(E_POWERSAVE_MODE_HIGH); - else - e_powersave_mode_set(E_POWERSAVE_MODE_EXTREME); - } - } - else - e_powersave_mode_set(E_POWERSAVE_MODE_LOW); - battery_config->full = full; - battery_config->time_left = time_left; - battery_config->have_battery = have_battery; - battery_config->have_power = have_power; - } - } - } - return 0; -} - -static int -_battery_cb_exe_del(void *data, int type, void *event) -{ - Ecore_Exe_Event_Del *ev; - - ev = event; - if (ev->exe != battery_config->batget_exe) return 1; - battery_config->batget_exe = NULL; - return 1; -} diff --git a/src/modules/battery/e_mod_main.h b/src/modules/battery/e_mod_main.h index 40e735a0c..36263e86f 100644 --- a/src/modules/battery/e_mod_main.h +++ b/src/modules/battery/e_mod_main.h @@ -27,10 +27,19 @@ struct _Config Ecore_Exe *batget_exe; Ecore_Event_Handler *batget_data_handler; Ecore_Event_Handler *batget_del_handler; + int have_hal; int full; int time_left; int have_battery; int have_power; + struct { + // FIXME: on bat_conf del dbus_pending_call_cancel(hal.have); + // then set hal.have to NULL + DBusPendingCall *have; + // FIXME: on bat_conf del e_dbus_signal_handler_del() these + E_DBus_Signal_Handler *dev_add; + E_DBus_Signal_Handler *dev_del; + } hal; }; EAPI extern E_Module_Api e_modapi;