From bafe1c825f57cbba5da23eaa8cd5dd9ae339202c Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 17 May 2010 08:57:47 +0000 Subject: [PATCH] more udev battery progress, seems like a good stopping point for tonight. still no functionality changes. SVN revision: 48943 --- src/modules/battery/e_mod_main.c | 10 ++- src/modules/battery/e_mod_main.h | 13 ++-- src/modules/battery/e_mod_udev.c | 113 +++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 6 deletions(-) diff --git a/src/modules/battery/e_mod_main.c b/src/modules/battery/e_mod_main.c index 8dee7cde4..9b29fd412 100644 --- a/src/modules/battery/e_mod_main.c +++ b/src/modules/battery/e_mod_main.c @@ -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; diff --git a/src/modules/battery/e_mod_main.h b/src/modules/battery/e_mod_main.h index db13a6dfb..58d53db38 100644 --- a/src/modules/battery/e_mod_main.h +++ b/src/modules/battery/e_mod_main.h @@ -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; diff --git a/src/modules/battery/e_mod_udev.c b/src/modules/battery/e_mod_udev.c index e69de29bb..31bd68cb0 100644 --- a/src/modules/battery/e_mod_udev.c +++ b/src/modules/battery/e_mod_udev.c @@ -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(); +} +