forked from enlightenment/enlightenment
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(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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue