From 389e9bfb02d39caf0c9e26ebc3f50d591704c387 Mon Sep 17 00:00:00 2001 From: Alastair Poole Date: Mon, 2 Dec 2019 20:47:01 +0000 Subject: [PATCH] batman: FreeBSD and OpenBSD (sysctl) After the work on the sysinfo gadgets for Linux the BSD variant code was a little bit of an afterthought. These changes provide us with unlimited battery/sysinfo gadgets and reliable status for our battery or batteries and our power supply. This patch allows us to add and remove (many) batman gadgets to the desktop without negatively affecting existing instances. It also takes into account additional sysinfo gadgets that include a batman instance. Iterating through the existing array of sysinfo gadgets to find multiple instances and apply changes it not ideal but it does not affect the Linux code, and keeps this change relatively simple. Tested on FreeBSD and OpenBSD with various hardware setups. Thanks to Peter2121 (Quelrond) for his testing. There is work to now improve batman's Linux behaviour to match that of the behaviour on BSD systems. --- src/modules/sysinfo/batman/batman.c | 9 ++-- src/modules/sysinfo/batman/batman.h | 2 +- src/modules/sysinfo/batman/batman_sysctl.c | 51 ++++++++++++++++++++-- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/modules/sysinfo/batman/batman.c b/src/modules/sysinfo/batman/batman.c index 9a9858a45..8a28f78bd 100644 --- a/src/modules/sysinfo/batman/batman.c +++ b/src/modules/sysinfo/batman/batman.c @@ -359,7 +359,7 @@ _batman_device_update(Instance *inst) static Eina_Bool _screensaver_on(void *data) { -#if defined(HAVE_EEZE) +#if defined(HAVE_EEZE) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) Instance *inst = data; #else (void)data; @@ -368,7 +368,7 @@ _screensaver_on(void *data) #if defined(HAVE_EEZE) _batman_udev_stop(inst); #elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) - _batman_sysctl_stop(); + _batman_sysctl_stop(inst); #elif defined(upower) _batman_upower_stop(); #else @@ -583,7 +583,7 @@ _batman_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data) #if defined(HAVE_EEZE) _batman_udev_stop(inst); #elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) - _batman_sysctl_stop(); + _batman_sysctl_stop(inst); #elif defined(upower) _batman_upower_stop(); #else @@ -616,8 +616,7 @@ sysinfo_batman_remove(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNU #if defined(HAVE_EEZE) _batman_udev_stop(inst); #elif defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) - (void)inst; - _batman_sysctl_stop(); + _batman_sysctl_stop(inst); #elif defined(upower) (void)inst; _batman_upower_stop(); diff --git a/src/modules/sysinfo/batman/batman.h b/src/modules/sysinfo/batman/batman.h index 31085a8e7..92b62479f 100644 --- a/src/modules/sysinfo/batman/batman.h +++ b/src/modules/sysinfo/batman/batman.h @@ -104,7 +104,7 @@ EINTERNvoid _batman_upower_stop(void); #else /* in batman_sysctl.c */ EINTERN int _batman_sysctl_start(Instance *inst); -EINTERN void _batman_sysctl_stop(void); +EINTERN void _batman_sysctl_stop(Instance *inst); /* end batman_sysctl.c */ #endif diff --git a/src/modules/sysinfo/batman/batman_sysctl.c b/src/modules/sysinfo/batman/batman_sysctl.c index a912c301a..42790318c 100644 --- a/src/modules/sysinfo/batman/batman_sysctl.c +++ b/src/modules/sysinfo/batman/batman_sysctl.c @@ -152,10 +152,45 @@ _batman_sysctl_start(Instance *inst) } void -_batman_sysctl_stop(void) +_batman_sysctl_stop(Instance *inst) { + Instance *child; + Eina_List *l; Battery *bat; Ac_Adapter *ac; + int bat_num = 0; + + /* This is a dummy battery we return here. */ + if (inst->cfg->batman.have_battery != 1) + { + return; + } + + /* If this is NOT the last batman gadget then we return before + * freeing everything. This is NOT optimal but is allows us to have + * many gadgets and share the same data between multiple batman + * gadget instances. The instance will be deleted. + */ + + EINA_LIST_FOREACH(sysinfo_instances, l, child) + { + if (inst->cfg->esm == E_SYSINFO_MODULE_BATMAN || + inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO) + { + bat_num++; + if (child == inst) + { + bat_num--; + break; + } + } + } + + /* This is not the last batman gadget. */ + if (bat_num > 0) return; + + /* We have no batman or sysinfo gadgets remaining. We can safely + remove these batteries and adapters. */ EINA_LIST_FREE(batman_device_ac_adapters, ac) { @@ -178,11 +213,18 @@ _batman_sysctl_stop(void) #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) static Eina_Bool -_batman_sysctl_battery_update_poll(void *data) +_batman_sysctl_battery_update_poll(void *data EINA_UNUSED) { - Instance *inst = data; + Eina_List *l; + Instance *inst; - _batman_sysctl_battery_update(inst); + /* We need to ensure we update both batman and sysinfo instances. */ + EINA_LIST_FOREACH(sysinfo_instances, l, inst) + { + if (inst->cfg->esm == E_SYSINFO_MODULE_BATMAN || + inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO) + _batman_sysctl_battery_update(inst); + } return EINA_TRUE; } @@ -204,6 +246,7 @@ _batman_sysctl_battery_update(Instance *inst) size_t len; int value, fd, i = 0; #endif + EINA_LIST_FOREACH(batman_device_batteries, l, bat) { /* update the poller interval */