Batman: Allow multiple instances of batman to work correctly.
This commit is contained in:
parent
9189293b46
commit
0b1fc0e368
|
@ -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_destroy(Instance *inst);
|
||||||
static void _batman_warning_popup(Instance *inst, int time, double percent);
|
static void _batman_warning_popup(Instance *inst, int time, double percent);
|
||||||
|
|
||||||
Battery *
|
Eina_List *
|
||||||
_batman_battery_find(const char *udi)
|
_batman_battery_find(const char *udi)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
Battery *bat;
|
Battery *bat;
|
||||||
|
Eina_List *batteries = NULL;
|
||||||
EINA_LIST_FOREACH(batman_device_batteries, l, bat)
|
EINA_LIST_FOREACH(batman_device_batteries, l, bat)
|
||||||
{ /* these are always stringshared */
|
{ /* 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)
|
_batman_ac_adapter_find(const char *udi)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
Ac_Adapter *ac;
|
Ac_Adapter *ac;
|
||||||
|
Eina_List *adapters = NULL;
|
||||||
EINA_LIST_FOREACH(batman_device_ac_adapters, l, ac)
|
EINA_LIST_FOREACH(batman_device_ac_adapters, l, ac)
|
||||||
{ /* these are always stringshared */
|
{ /* 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
|
static void
|
||||||
|
|
|
@ -77,8 +77,8 @@ struct _Ac_Adapter
|
||||||
int * mib;
|
int * mib;
|
||||||
};
|
};
|
||||||
|
|
||||||
Battery *_batman_battery_find(const char *udi);
|
Eina_List *_batman_battery_find(const char *udi);
|
||||||
Ac_Adapter *_batman_ac_adapter_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_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);
|
void _batman_device_update(Instance *inst);
|
||||||
/* in batman_fallback.c */
|
/* in batman_fallback.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_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_battery_add(const char *syspath, Instance *inst);
|
||||||
static void _batman_udev_ac_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_battery_del(const char *syspath, Instance *inst);
|
||||||
static void _batman_udev_ac_del(const char *syspath);
|
static void _batman_udev_ac_del(const char *syspath, Instance *inst);
|
||||||
static Eina_Bool _batman_udev_battery_update_poll(void *data);
|
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_battery_update(const char *syspath, Battery *bat, Instance *inst);
|
||||||
static void _batman_udev_ac_update(const char *syspath, Ac_Adapter *ac, 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);
|
_batman_udev_battery_add(syspath, inst);
|
||||||
else if ((event & EEZE_UDEV_EVENT_REMOVE) ||
|
else if ((event & EEZE_UDEV_EVENT_REMOVE) ||
|
||||||
(event & EEZE_UDEV_EVENT_OFFLINE))
|
(event & EEZE_UDEV_EVENT_OFFLINE))
|
||||||
_batman_udev_battery_del(syspath);
|
_batman_udev_battery_del(syspath, inst);
|
||||||
else /* must be change */
|
else /* must be change */
|
||||||
_batman_udev_battery_update(syspath, NULL, inst);
|
_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);
|
_batman_udev_ac_add(syspath, inst);
|
||||||
else if ((event & EEZE_UDEV_EVENT_REMOVE) ||
|
else if ((event & EEZE_UDEV_EVENT_REMOVE) ||
|
||||||
(event & EEZE_UDEV_EVENT_OFFLINE))
|
(event & EEZE_UDEV_EVENT_OFFLINE))
|
||||||
_batman_udev_ac_del(syspath);
|
_batman_udev_ac_del(syspath, inst);
|
||||||
else /* must be change */
|
else /* must be change */
|
||||||
_batman_udev_ac_update(syspath, NULL, inst);
|
_batman_udev_ac_update(syspath, NULL, inst);
|
||||||
}
|
}
|
||||||
|
@ -97,13 +97,25 @@ static void
|
||||||
_batman_udev_battery_add(const char *syspath, Instance *inst)
|
_batman_udev_battery_add(const char *syspath, Instance *inst)
|
||||||
{
|
{
|
||||||
Battery *bat;
|
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);
|
EINA_LIST_FOREACH(batteries, l, bat)
|
||||||
bat->inst = inst;
|
{
|
||||||
_batman_udev_battery_update(NULL, bat, inst);
|
if (inst == bat->inst)
|
||||||
return;
|
{
|
||||||
|
_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)))
|
if (!(bat = E_NEW(Battery, 1)))
|
||||||
|
@ -125,12 +137,25 @@ static void
|
||||||
_batman_udev_ac_add(const char *syspath, Instance *inst)
|
_batman_udev_ac_add(const char *syspath, Instance *inst)
|
||||||
{
|
{
|
||||||
Ac_Adapter *ac;
|
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);
|
EINA_LIST_FOREACH(adapters, l, ac)
|
||||||
_batman_udev_ac_update(NULL, ac, inst);
|
{
|
||||||
return;
|
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)))
|
if (!(ac = E_NEW(Ac_Adapter, 1)))
|
||||||
|
@ -145,40 +170,55 @@ _batman_udev_ac_add(const char *syspath, Instance *inst)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_batman_udev_battery_del(const char *syspath)
|
_batman_udev_battery_del(const char *syspath, Instance *inst)
|
||||||
{
|
{
|
||||||
Battery *bat;
|
Battery *bat;
|
||||||
|
Eina_List *batteries = _batman_battery_find(syspath), *l;
|
||||||
if (!(bat = _batman_battery_find(syspath)))
|
if (!eina_list_count(batteries))
|
||||||
{
|
{
|
||||||
eina_stringshare_del(syspath);
|
eina_stringshare_del(syspath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
batman_device_batteries = eina_list_remove(batman_device_batteries, bat);
|
EINA_LIST_FOREACH(batman_device_batteries, l, bat)
|
||||||
eina_stringshare_del(bat->udi);
|
{
|
||||||
eina_stringshare_del(bat->technology);
|
if (inst == bat->inst)
|
||||||
eina_stringshare_del(bat->model);
|
{
|
||||||
eina_stringshare_del(bat->vendor);
|
batman_device_batteries = eina_list_remove_list(batman_device_batteries, l);
|
||||||
E_FREE_FUNC(bat->poll, ecore_poller_del);
|
eina_stringshare_del(bat->udi);
|
||||||
E_FREE_FUNC(bat, free);
|
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
|
static void
|
||||||
_batman_udev_ac_del(const char *syspath)
|
_batman_udev_ac_del(const char *syspath, Instance *inst)
|
||||||
{
|
{
|
||||||
Ac_Adapter *ac;
|
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);
|
eina_stringshare_del(syspath);
|
||||||
_batman_device_update(ac->inst);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
EINA_LIST_FOREACH(batman_device_ac_adapters, l, ac)
|
||||||
batman_device_ac_adapters = eina_list_remove(batman_device_ac_adapters, ac);
|
{
|
||||||
eina_stringshare_del(ac->udi);
|
if (inst == ac->inst)
|
||||||
E_FREE_FUNC(ac, free);
|
{
|
||||||
|
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
|
static Eina_Bool
|
||||||
|
@ -213,11 +253,8 @@ _batman_udev_battery_update(const char *syspath, Battery *bat, Instance *inst)
|
||||||
|
|
||||||
if (!bat)
|
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 */
|
/* update the poller interval */
|
||||||
ecore_poller_poller_interval_set(bat->poll, bat->inst->cfg->batman.poll_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)
|
||||||
{
|
{
|
||||||
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);
|
GET_NUM(ac, present, POWER_SUPPLY_ONLINE);
|
||||||
|
|
|
@ -304,30 +304,51 @@ _device_added_cb(void *data, const Eldbus_Message *msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_device_removed_cb(void *data EINA_UNUSED, const Eldbus_Message *msg)
|
_device_removed_cb(void *data, const Eldbus_Message *msg)
|
||||||
{
|
{
|
||||||
Battery *bat;
|
Battery *bat;
|
||||||
Ac_Adapter *ac;
|
Ac_Adapter *ac;
|
||||||
const char *path;
|
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))
|
if (!eldbus_message_arguments_get(msg, "o", &path))
|
||||||
return;
|
return;
|
||||||
bat = _batman_battery_find(path);
|
batteries = _batman_battery_find(path);
|
||||||
if (bat)
|
if (eina_list_count(batteries))
|
||||||
{
|
{
|
||||||
inst = bat->inst;
|
EINA_LIST_FOREACH(batteries, l, bat)
|
||||||
_battery_free(bat);
|
{
|
||||||
_batman_device_update(inst);
|
if (inst == bat->inst)
|
||||||
return;
|
{
|
||||||
|
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);
|
exists = EINA_FALSE;
|
||||||
if (ac)
|
adapters = _batman_ac_adapter_get(path);
|
||||||
|
if (eina_list_count(adapters))
|
||||||
{
|
{
|
||||||
inst = ac->inst;
|
EINA_LIST_FOREACH(adapters, l, ac)
|
||||||
_ac_free(ac);
|
{
|
||||||
_batman_device_update(inst);
|
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_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, "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;
|
return 1;
|
||||||
|
|
||||||
proxy_error:
|
proxy_error:
|
||||||
|
|
Loading…
Reference in New Issue