more udev battery progress, seems like a good stopping point for tonight.
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Mon, 17 May 2010 08:57:47 +0000 (08:57 +0000)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Mon, 17 May 2010 08:57:47 +0000 (08:57 +0000)
still no functionality changes.

SVN revision: 48943

src/modules/battery/e_mod_main.c
src/modules/battery/e_mod_main.h
src/modules/battery/e_mod_udev.c

index 8dee7cd..9b29fd4 100644 (file)
@@ -354,7 +354,9 @@ _battery_config_updated(void)
      }
    if (battery_config->have_subsystem == UNKNOWN)
      {
+#ifndef HAVE_EUDEV
         if (!e_dbus_bus_get(DBUS_BUS_SYSTEM))
+#endif
           battery_config->have_subsystem = NOSUBSYSTEM;
      }
 
@@ -378,19 +380,23 @@ _battery_config_updated(void)
    else if ((battery_config->have_subsystem == UNKNOWN) ||
             (battery_config->force_mode == 2))
      {
-        E_DBus_Connection *conn;
-
         if (battery_config->batget_exe)
           {
              ecore_exe_terminate(battery_config->batget_exe);
              ecore_exe_free(battery_config->batget_exe);
              battery_config->batget_exe = NULL;
           }
+#ifdef HAVE_EUDEV
+        _battery_udev_start();
+#else
+        E_DBus_Connection *conn;
         conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
         if (conn)
           {
              battery_config->have_subsystem = SUBSYSTEM;
+
              _battery_dbus_have_dbus();
+#endif
           }
         else
           battery_config->have_subsystem = NOSUBSYSTEM;
index db13a6d..58d53db 100644 (file)
@@ -42,7 +42,8 @@ struct _Config
    int                  have_power;
    int                  have_subsystem;
 #ifdef HAVE_EUDEV
-   Eeze_Udev_Watch     *watch;
+   Eeze_Udev_Watch     *acwatch;
+   Eeze_Udev_Watch     *batwatch;
 #else
    struct {
       // FIXME: on bat_conf del dbus_pending_call_cancel(dbus.have);
@@ -96,15 +97,16 @@ struct _Ac_Adapter
    const char *product;
 };
 
+Battery *_battery_battery_find(const char *udi);
+Ac_Adapter *_battery_ac_adapter_find(const char *udi);
+/* in e_mod_dbus.c */
 void _battery_dbus_battery_props(void *data, void *reply_data, DBusError *error);
 void _battery_dbus_ac_adapter_props(void *data, void *reply_data, DBusError *error);
 void _battery_dbus_battery_property_changed(void *data, DBusMessage *msg);
 void _battery_dbus_battery_add(const char *udi);
 void _battery_dbus_battery_del(const char *udi);
-Battery *_battery_battery_find(const char *udi);
 void _battery_dbus_ac_adapter_add(const char *udi);
 void _battery_dbus_ac_adapter_del(const char *udi);
-Ac_Adapter *_battery_ac_adapter_find(const char *udi);
 void _battery_dbus_find_battery(void *user_data, void *reply_data, DBusError *err);
 void _battery_dbus_find_ac(void *user_data, void *reply_data, DBusError *err);
 void _battery_dbus_is_battery(void *user_data, void *reply_data, DBusError *err);
@@ -114,7 +116,10 @@ void _battery_dbus_dev_del(void *data, DBusMessage *msg);
 void _battery_dbus_have_dbus(void);
 void _battery_dbus_shutdown(void);
 void _battery_device_update(void);
-
+/* end e_mod_dbus.c */
+/* in e_mod_udev.c */
+void _battery_udev_start(void);
+/* end e_mod_udev.c */
 Eina_List *device_batteries;
 Eina_List *device_ac_adapters;
 double init_time;
index e69de29..31bd68c 100644 (file)
@@ -0,0 +1,113 @@
+#include "e.h"
+#include "e_mod_main.h"
+
+void
+_battery_udev_start()
+{
+   device_batteries = eeze_udev_find_by_type(EEZE_UDEV_TYPE_POWER_BAT, NULL);
+   device_ac_adapters = eeze_udev_find_by_type(EEZE_UDEV_TYPE_POWER_AC, NULL);
+
+   battery_config->batwatch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_BAT, _battery_udev_event_battery, NULL);
+   battery_config->acwatch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_AC, _battery_udev_event_ac, NULL);
+
+   init_time = ecore_time_get();
+}
+
+void
+_battery_udev_event_battery(const char syspath, const char *event, void *data, Eeze_Udev_Watch *watch)
+{
+   if ((!strcmp(event, "add")) || (!strcmp(event, "online")))
+     _battery_udev_battery_add(syspath);
+   else if ((!strcmp(event, "remove")) || (!strcmp(event, "offline")))
+     _battery_udev_battery_del(syspath);
+   else /* must be change */
+     _battery_udev_battery_update(syspath, data);
+}
+
+void
+_battery_udev_event_ac(const char syspath, const char *event, void *data, Eeze_Udev_Watch *watch)
+{
+   if ((!strcmp(event, "add")) || (!strcmp(event, "online")))
+     _battery_udev_ac_add(syspath);
+   else if ((!strcmp(event, "remove")) || (!strcmp(event, "offline")))
+     _battery_udev_ac_del(syspath);
+   else /* must be change */
+     _battery_udev_ac_update(syspath, data);
+}
+
+void
+_battery_udev_battery_add(const char *syspath)
+{
+   Battery *bat;
+
+   if (!(bat = _battery_battery_find(syspath)))
+     {
+        if (!(bat = E_NEW(Battery, 1);
+          {
+             eina_stringshare_del(syspath);
+             return;
+          }
+        bat->udi = syspath; /* already stringshared */
+        device_batteries = eina_list_append(device_batteries, bat);
+        bat->watch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_BAT, _battery_udev_event_battery, bat);
+        _battery_udev_battery_init(bat);
+
+        _battery_device_update();
+}
+
+void
+_battery_udev_ac_add(const char *syspath)
+{
+   Ac_Adapter *ac;
+
+   if (!(ac = _battery_ac_adapter_find(syspath)))
+     {
+        if (!(ac = E_NEW(Ac_Adapter, 1);
+          {
+             eina_stringshare_del(syspath);
+             return;
+          }
+        ac->udi = syspath; /* already stringshared */
+        device_ac_adapters = eina_list_append(device_ac_adapters, ac);
+        ac->watch = eeze_udev_watch_add(EEZE_UDEV_TYPE_POWER_AC, _battery_udev_event_ac, ac);
+        _battery_udev_ac_init(ac);
+
+        _battery_device_update();
+}
+
+void
+_battery_udev_battery_del(const char *syspath)
+{
+   Eina_List *l;
+   Battery *bat;
+
+   if ((battery = _battery_battery_find(syspath)))
+     {
+        eeze_udev_watch_del(bat->watch);
+        l = eina_list_data_find(device_batteries, bat);
+        eina_stringshare_del(bat->udi);
+        free(bat);
+        device_batteries = eina_list_remove_list(device_batteries, l);
+        return;
+     }
+   _battery_device_update();
+}
+
+void
+_battery_udev_ac_del(const char *syspath)
+{
+   Eina_List *l;
+   Ac_Adapter *ac;
+
+   if ((ac = _battery_ac_adapter_find(syspath)))
+     {
+        eeze_udev_watch_del(ac->watch);
+        l = eina_list_data_find(device_ac_adapters, ac);
+        eina_stringshare_del(ac->udi);
+        free(ac);
+        device_ac_adapters = eina_list_remove_list(device_ac_adapters, l);
+        return;
+     }
+   _battery_device_update();
+}
+