okra pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=0b1fc0e36896f853b224812cd913d12605ffdc14

commit 0b1fc0e36896f853b224812cd913d12605ffdc14
Author: Stephen 'Okra' Houston <[email protected]>
Date:   Sat Jan 7 17:39:48 2017 -0600

    Batman: Allow multiple instances of batman to work correctly.
---
 src/modules/sysinfo/batman/batman.c        |  14 ++--
 src/modules/sysinfo/batman/batman.h        |   4 +-
 src/modules/sysinfo/batman/batman_udev.c   | 116 +++++++++++++++++++----------
 src/modules/sysinfo/batman/batman_upower.c |  51 +++++++++----
 4 files changed, 121 insertions(+), 64 deletions(-)

diff --git a/src/modules/sysinfo/batman/batman.c 
b/src/modules/sysinfo/batman/batman.c
index 80d5415..dbd5be1 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 7d6184a..50a2bb4 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 610940c..5789a94 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 2476b15..18cd717 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:

-- 


Reply via email to