Batman: Allow multiple instances of batman to work correctly.

This commit is contained in:
Stephen 'Okra' Houston 2017-01-07 17:39:48 -06:00
parent 9189293b46
commit 0b1fc0e368
4 changed files with 121 additions and 64 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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,14 +97,26 @@ 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_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);
bat->inst = inst;
_batman_udev_battery_update(NULL, bat, inst);
eina_list_free(batteries);
return;
}
}
if (!(bat = E_NEW(Battery, 1)))
{
@ -125,13 +137,26 @@ 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_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);
_batman_udev_ac_update(NULL, ac, inst);
eina_list_free(adapters);
return;
}
}
if (!(ac = E_NEW(Ac_Adapter, 1)))
{
@ -145,17 +170,21 @@ _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_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);
@ -163,23 +192,34 @@ _batman_udev_battery_del(const char *syspath)
E_FREE_FUNC(bat->poll, ecore_poller_del);
E_FREE_FUNC(bat, free);
}
static void
_batman_udev_ac_del(const char *syspath)
{
Ac_Adapter *ac;
if (!(ac = _batman_ac_adapter_find(syspath)))
{
}
eina_stringshare_del(syspath);
_batman_device_update(ac->inst);
return;
eina_list_free(batteries);
}
batman_device_ac_adapters = eina_list_remove(batman_device_ac_adapters, ac);
static void
_batman_udev_ac_del(const char *syspath, Instance *inst)
{
Ac_Adapter *ac;
Eina_List *adapters = _batman_ac_adapter_find(syspath), *l;
if (!eina_list_count(adapters))
{
eina_stringshare_del(syspath);
return;
}
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
_batman_udev_battery_update_poll(void *data)
@ -212,13 +252,10 @@ _batman_udev_battery_update(const char *syspath, Battery *bat, Instance *inst)
double t, charge;
if (!bat)
{
if (!(bat = _batman_battery_find(syspath)))
{
_batman_udev_battery_add(syspath, inst);
return;
}
}
/* update the poller interval */
ecore_poller_poller_interval_set(bat->poll, bat->inst->cfg->batman.poll_interval);
@ -304,13 +341,10 @@ _batman_udev_ac_update(const char *syspath, Ac_Adapter *ac, Instance *inst)
const char *test;
if (!ac)
{
if (!(ac = _batman_ac_adapter_find(syspath)))
{
_batman_udev_ac_add(syspath, inst);
return;
}
}
GET_NUM(ac, present, POWER_SUPPLY_ONLINE);
/* yes, it's really that simple. */

View File

@ -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))
{
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))
{
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: