diff --git a/src/modules/sysinfo/batman/batman.c b/src/modules/sysinfo/batman/batman.c index 80d54152f..dbd5be180 100644 --- a/src/modules/sysinfo/batman/batman.c +++ b/src/modules/sysinfo/batman/batman.c @@ -10,30 +10,32 @@ static void _batman_cb_warning_popup_hide(void *data, Evas *e, Evas_Object static void _batman_warning_popup_destroy(Instance *inst); static void _batman_warning_popup(Instance *inst, int time, double percent); -Battery * +Eina_List * _batman_battery_find(const char *udi) { Eina_List *l; Battery *bat; + Eina_List *batteries = NULL; EINA_LIST_FOREACH(batman_device_batteries, l, bat) { /* these are always stringshared */ - if (udi == bat->udi) return bat; + if (udi == bat->udi) batteries = eina_list_append(batteries, bat); } - return NULL; + return batteries; } -Ac_Adapter * +Eina_List * _batman_ac_adapter_find(const char *udi) { Eina_List *l; Ac_Adapter *ac; + Eina_List *adapters = NULL; EINA_LIST_FOREACH(batman_device_ac_adapters, l, ac) { /* these are always stringshared */ - if (udi == ac->udi) return ac; + if (udi == ac->udi) adapters = eina_list_append(adapters, ac); } - return NULL; + return adapters; } static void diff --git a/src/modules/sysinfo/batman/batman.h b/src/modules/sysinfo/batman/batman.h index 7d6184a1e..50a2bb4bb 100644 --- a/src/modules/sysinfo/batman/batman.h +++ b/src/modules/sysinfo/batman/batman.h @@ -77,8 +77,8 @@ struct _Ac_Adapter int * mib; }; -Battery *_batman_battery_find(const char *udi); -Ac_Adapter *_batman_ac_adapter_find(const char *udi); +Eina_List *_batman_battery_find(const char *udi); +Eina_List *_batman_ac_adapter_find(const char *udi); void _batman_update(Instance *inst, int full, int time_left, int time_full, Eina_Bool have_battery, Eina_Bool have_power); void _batman_device_update(Instance *inst); /* in batman_fallback.c */ diff --git a/src/modules/sysinfo/batman/batman_udev.c b/src/modules/sysinfo/batman/batman_udev.c index 610940c0a..5789a9403 100644 --- a/src/modules/sysinfo/batman/batman_udev.c +++ b/src/modules/sysinfo/batman/batman_udev.c @@ -4,8 +4,8 @@ static void _batman_udev_event_battery(const char *syspath, Eeze_Udev_Event even static void _batman_udev_event_ac(const char *syspath, Eeze_Udev_Event event, void *data, Eeze_Udev_Watch *watch); static void _batman_udev_battery_add(const char *syspath, Instance *inst); static void _batman_udev_ac_add(const char *syspath, Instance *inst); -static void _batman_udev_battery_del(const char *syspath); -static void _batman_udev_ac_del(const char *syspath); +static void _batman_udev_battery_del(const char *syspath, Instance *inst); +static void _batman_udev_ac_del(const char *syspath, Instance *inst); static Eina_Bool _batman_udev_battery_update_poll(void *data); static void _batman_udev_battery_update(const char *syspath, Battery *bat, Instance *inst); static void _batman_udev_ac_update(const char *syspath, Ac_Adapter *ac, Instance *inst); @@ -73,7 +73,7 @@ _batman_udev_event_battery(const char *syspath, Eeze_Udev_Event event, void *dat _batman_udev_battery_add(syspath, inst); else if ((event & EEZE_UDEV_EVENT_REMOVE) || (event & EEZE_UDEV_EVENT_OFFLINE)) - _batman_udev_battery_del(syspath); + _batman_udev_battery_del(syspath, inst); else /* must be change */ _batman_udev_battery_update(syspath, NULL, inst); } @@ -88,7 +88,7 @@ _batman_udev_event_ac(const char *syspath, Eeze_Udev_Event event, void *data, Ee _batman_udev_ac_add(syspath, inst); else if ((event & EEZE_UDEV_EVENT_REMOVE) || (event & EEZE_UDEV_EVENT_OFFLINE)) - _batman_udev_ac_del(syspath); + _batman_udev_ac_del(syspath, inst); else /* must be change */ _batman_udev_ac_update(syspath, NULL, inst); } @@ -97,13 +97,25 @@ static void _batman_udev_battery_add(const char *syspath, Instance *inst) { Battery *bat; + Eina_List *batteries = _batman_battery_find(syspath), *l; + Eina_Bool exists = EINA_FALSE; - if ((bat = _batman_battery_find(syspath))) + if (eina_list_count(batteries)) { - eina_stringshare_del(syspath); - bat->inst = inst; - _batman_udev_battery_update(NULL, bat, inst); - return; + EINA_LIST_FOREACH(batteries, l, bat) + { + if (inst == bat->inst) + { + _batman_udev_battery_update(NULL, bat, inst); + exists = EINA_TRUE; + } + } + if (exists) + { + eina_stringshare_del(syspath); + eina_list_free(batteries); + return; + } } if (!(bat = E_NEW(Battery, 1))) @@ -125,12 +137,25 @@ static void _batman_udev_ac_add(const char *syspath, Instance *inst) { Ac_Adapter *ac; + Eina_List *adapters = _batman_ac_adapter_find(syspath), *l; + Eina_Bool exists = EINA_FALSE; - if ((ac = _batman_ac_adapter_find(syspath))) + if (eina_list_count(adapters)) { - eina_stringshare_del(syspath); - _batman_udev_ac_update(NULL, ac, inst); - return; + EINA_LIST_FOREACH(adapters, l, ac) + { + if (inst == ac->inst) + { + _batman_udev_ac_update(NULL, ac, inst); + exists = EINA_TRUE; + } + } + if (exists) + { + eina_stringshare_del(syspath); + eina_list_free(adapters); + return; + } } if (!(ac = E_NEW(Ac_Adapter, 1))) @@ -145,40 +170,55 @@ _batman_udev_ac_add(const char *syspath, Instance *inst) } static void -_batman_udev_battery_del(const char *syspath) +_batman_udev_battery_del(const char *syspath, Instance *inst) { Battery *bat; - - if (!(bat = _batman_battery_find(syspath))) + Eina_List *batteries = _batman_battery_find(syspath), *l; + if (!eina_list_count(batteries)) { eina_stringshare_del(syspath); return; } - batman_device_batteries = eina_list_remove(batman_device_batteries, bat); - eina_stringshare_del(bat->udi); - eina_stringshare_del(bat->technology); - eina_stringshare_del(bat->model); - eina_stringshare_del(bat->vendor); - E_FREE_FUNC(bat->poll, ecore_poller_del); - E_FREE_FUNC(bat, free); + EINA_LIST_FOREACH(batman_device_batteries, l, bat) + { + if (inst == bat->inst) + { + batman_device_batteries = eina_list_remove_list(batman_device_batteries, l); + eina_stringshare_del(bat->udi); + eina_stringshare_del(bat->technology); + eina_stringshare_del(bat->model); + eina_stringshare_del(bat->vendor); + E_FREE_FUNC(bat->poll, ecore_poller_del); + E_FREE_FUNC(bat, free); + } + } + eina_stringshare_del(syspath); + eina_list_free(batteries); } static void -_batman_udev_ac_del(const char *syspath) +_batman_udev_ac_del(const char *syspath, Instance *inst) { Ac_Adapter *ac; + Eina_List *adapters = _batman_ac_adapter_find(syspath), *l; - if (!(ac = _batman_ac_adapter_find(syspath))) + if (!eina_list_count(adapters)) { - eina_stringshare_del(syspath); - _batman_device_update(ac->inst); + eina_stringshare_del(syspath); return; } - - batman_device_ac_adapters = eina_list_remove(batman_device_ac_adapters, ac); - eina_stringshare_del(ac->udi); - E_FREE_FUNC(ac, free); + EINA_LIST_FOREACH(batman_device_ac_adapters, l, ac) + { + if (inst == ac->inst) + { + batman_device_ac_adapters = eina_list_remove_list(batman_device_ac_adapters, l); + eina_stringshare_del(ac->udi); + E_FREE_FUNC(ac, free); + } + } + eina_stringshare_del(syspath); + eina_list_free(adapters); } static Eina_Bool @@ -213,11 +253,8 @@ _batman_udev_battery_update(const char *syspath, Battery *bat, Instance *inst) if (!bat) { - if (!(bat = _batman_battery_find(syspath))) - { - _batman_udev_battery_add(syspath, inst); - return; - } + _batman_udev_battery_add(syspath, inst); + return; } /* update the poller interval */ ecore_poller_poller_interval_set(bat->poll, bat->inst->cfg->batman.poll_interval); @@ -305,11 +342,8 @@ _batman_udev_ac_update(const char *syspath, Ac_Adapter *ac, Instance *inst) if (!ac) { - if (!(ac = _batman_ac_adapter_find(syspath))) - { - _batman_udev_ac_add(syspath, inst); - return; - } + _batman_udev_ac_add(syspath, inst); + return; } GET_NUM(ac, present, POWER_SUPPLY_ONLINE); diff --git a/src/modules/sysinfo/batman/batman_upower.c b/src/modules/sysinfo/batman/batman_upower.c index 2476b1509..18cd71741 100644 --- a/src/modules/sysinfo/batman/batman_upower.c +++ b/src/modules/sysinfo/batman/batman_upower.c @@ -304,30 +304,51 @@ _device_added_cb(void *data, const Eldbus_Message *msg) } static void -_device_removed_cb(void *data EINA_UNUSED, const Eldbus_Message *msg) +_device_removed_cb(void *data, const Eldbus_Message *msg) { Battery *bat; Ac_Adapter *ac; const char *path; - Instance *inst; + Instance *inst = data; + Eina_List *batteries, *adapters, *l; + Eina_Bool exists = EINA_FALSE; if (!eldbus_message_arguments_get(msg, "o", &path)) return; - bat = _batman_battery_find(path); - if (bat) + batteries = _batman_battery_find(path); + if (eina_list_count(batteries)) { - inst = bat->inst; - _battery_free(bat); - _batman_device_update(inst); - return; + EINA_LIST_FOREACH(batteries, l, bat) + { + if (inst == bat->inst) + { + inst = bat->inst; + _battery_free(bat); + _batman_device_update(inst); + exists = EINA_TRUE; + } + } + if (exists) + { + eina_list_free(batteries); + return; + } } - ac = _batman_ac_adapter_find(path); - if (ac) + exists = EINA_FALSE; + adapters = _batman_ac_adapter_get(path); + if (eina_list_count(adapters)) { - inst = ac->inst; - _ac_free(ac); - _batman_device_update(inst); - + EINA_LIST_FOREACH(adapters, l, ac) + { + if (ac->inst == inst) + { + inst = ac->inst; + _ac_free(ac); + _batman_device_update(inst); + exists = EINA_TRUE; + } + } + eina_list_free(adapters); } } @@ -346,7 +367,7 @@ _batman_upower_start(Instance *inst) eldbus_proxy_call(upower_proxy, "EnumerateDevices", _enumerate_cb, inst, -1, ""); eldbus_proxy_signal_handler_add(upower_proxy, "DeviceAdded", _device_added_cb, inst); - eldbus_proxy_signal_handler_add(upower_proxy, "DeviceRemoved", _device_removed_cb, NULL); + eldbus_proxy_signal_handler_add(upower_proxy, "DeviceRemoved", _device_removed_cb, inst); return 1; proxy_error: